From 1c5ba9d48fb1f055921e98b3d50f4b78e93aaa58 Mon Sep 17 00:00:00 2001
From: Gary Williams <gary.williams@forgerock.com>
Date: Wed, 28 Mar 2012 14:02:43 +0000
Subject: [PATCH] refactor replication functional tests to be one test per function
---
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic_tests.xml | 2482 +++++
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy_tests.xml | 422
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption_tests.xml | 1088 ++
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate_tests.xml | 565 +
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog_tests.xml | 1529 +++
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization_tests.xml | 897 +
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml | 624 -
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml | 1055 -
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy.xml | 497
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci_tests.xml | 1162 ++
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic.xml | 2168 ----
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml | 3715 -------
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport_tests.xml | 421
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization.xml | 916 -
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml | 3820 ++++++++
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover.xml | 617 -
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema_tests.xml | 1131 ++
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover_tests.xml | 611 +
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml | 1532 ---
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml | 521
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml | 1167 --
opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml | 1141 --
22 files changed, 15,489 insertions(+), 12,592 deletions(-)
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml
index d79f07e..fc6f3d2 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci.xml
@@ -7,1079 +7,164 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2010 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
-
<defaultcall function="replication_aci"/>
-
- <function name="replication_aci">
-
+ <function name="replication_aci" scope="local">
<sequence>
+ <block name="'replication_aci'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'aci'
+
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication ACI'
+ </script>
- <block name="'aci'">
+ <!--- Test Suite information
+ #@TestSuiteName Replication ACI Tests
+ #@TestSuitePurpose Verify that the ACI operations are replicated
+ correctly between two servers.
+ #@TestSuiteID ACI Tests
+ #@TestSuiteGroup ACI
+ #@TestGroup Replication
+ #@TestScript replication_aci.xml
+ #@TestHTMLLink http://www.forgerock.org/
+ -->
+
+ <call function="'testSuite_Preamble'"/>
- <sequence>
-
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='aci'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication ACI Tests
- #@TestSuitePurpose Verify that updates on ACIs are replicated all
- right and are applied accordingly across the
- topology.
- #@TestSuiteID ACI Tests
- #@TestSuiteGroup ACI
- #@TestGroup Replication
- #@TestScript replication_aci.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
+ <try>
+ <sequence>
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'">
- { 'dataFile' : 'Short_Example.ldif' ,
- 'label' : 'Replication ACI' }
- </call>
-
- <script>
- class Entry:
- def __init__(self, rdn, suffix):
- self.userDn = '%s,ou=People,%s' \
- % (rdn, suffix)
- self.suffix = suffix
- self.listAttr = []
- self.listAttr.append('objectclass:top')
- self.listAttr.append('objectclass:organizationalperson')
- self.listAttr.append('objectclass:inetorgperson')
- self.listAttr.append('objectclass:person')
- def getDn(self):
- return self.userDn
- def getSuffix(self):
- return self.suffix
- def getAttrList(self):
- return self.listAttr
- def addAttr(self, attrType, attrValue):
- self.listAttr.append('%s:%s' % (attrType, attrValue))
- </script>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'">
+ { 'dataFile' : 'Short_Example.ldif' ,
+ 'label' : _label }
+ </call>
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('aci/aci_tests')
+ </script>
-
- <!--- Test Case information
- #@TestMarker Replication ACI Tests
- #@TestName Replication: ACI: Add entry with ACI
- #@TestID Add entry with ACI
- #@TestPurpose Check ACI replication over an entry add
- #@TestPreamble
- #@TestSteps Add entry with ACI: deny self description write
- #@TestSteps Binding as entry, add givenname to entry
- (expect SUCCESS)
- #@TestSteps Binding as entry, add description to entry
- (expect ERROR 50)
- #@TestPostamble
- #@TestResult Success if the servers synchronised and the aci
- correctly applied after replication
- -->
- <testcase name="getTestCaseName('Add entry with ACI')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: ACI: Add entry with ACI. Check ACI replication \
- over an entry add.'
- </message>
-
- <script>
- myAci = "(targetattr=\"description\")(version 3.0; acl \"Deny Self Description Write\"; deny (write) userdn=\"ldap:///self\";)"
- myUserpassword = 'entryPwd'
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
- myEntry = Entry('cn=ACI entry', synchroSuffix)
- myEntry.addAttr('sn', 'ACI repl tests')
- myEntry.addAttr('aci', myAci)
- myEntry.addAttr('userpassword', myUserpassword)
- </script>
-
- <!-- Add entry to "master" server with aci:
- ! (targetattr="description")(version 3.0; acl
- ! "Deny Self Description Write"; deny (write)
- ! userdn="ldap:///self";)
- -->
- <message>
- 'Add entry %s with ACI: \n%s' % (myEntry.getDn(), myAci)
- </message>
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <message>
- '+++ New ACI +++\nDeny "%s" the access to write its own \
- description attribute.' % myEntry.getDn()
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: ACI:'
+ class Entry:
+ def __init__(self, rdn, suffix):
+ self.userDn = '%s,ou=People,%s' \
+ % (rdn, suffix)
+ self.suffix = suffix
+ self.listAttr = []
+ self.listAttr.append('objectclass:top')
+ self.listAttr.append('objectclass:organizationalperson')
+ self.listAttr.append('objectclass:inetorgperson')
+ self.listAttr.append('objectclass:person')
+ def getDn(self):
+ return self.userDn
+ def getSuffix(self):
+ return self.suffix
+ def getAttrList(self):
+ return self.listAttr
+ def addAttr(self, attrType, attrValue):
+ self.listAttr.append('%s:%s' % (attrType, attrValue))
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_aci_001')
+ testsList.append('replication_aci_002')
+ testsList.append('replication_aci_003')
+ testsList.append('replication_aci_004')
+ testsList.append('replication_aci_005')
+ testsList.append('replication_aci_006')
+ testsList.append('replication_aci_007')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ <catch exception="'STAFException.TestSuite.SetupException'">
<sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- myGivenname = 'My own GIVENNAME value %s' % i
- myDescription = 'My own DESCRIPTION value %s' % i
- </script>
-
- <message>
- 'Binding as "%s", add givenname %s to entry %s on server \
- %s:%s. -- Expect: SUCCESS' % \
- (myEntry.getDn(), myGivenname, myEntry.getDn(),
- server.getHostname(), server.getPort())
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
</message>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'DNToModify' : myEntry.getDn(),
- 'attributeName' : 'givenname',
- 'newAttributeValue' : myGivenname,
- 'changetype' : 'add'
- }
- </call>
-
- <message>
- 'Binding as "%s", add description %s to entry %s on \
- server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
- Rights)' % \
- (myEntry.getDn(), myDescription, myEntry.getDn(),
- server.getHostname(), server.getPort())
- </message>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'DNToModify' : myEntry.getDn(),
- 'attributeName' : 'description',
- 'newAttributeValue' : myDescription,
- 'changetype' : 'add',
- 'expectedRC' : 50
- }
- </call>
+ <rethrow/>
</sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
+ </try>
+
+ </sequence>
-
-
- <!--- Test Case information
- #@TestMarker Replication ACI Tests
- #@TestName Replication: ACI: Modify_add ACI
- #@TestID Modify_add ACI
- #@TestPurpose Check ACI replication over a modify_add
- #@TestPreamble Add a user entry to suffix
- #@TestSteps Binding as user, add description to child entry
- (expect ERROR 50)
- #@TestSteps Add ACI to parent entry: allow user full access
- to all description attributes
- #@TestSteps Binding as user, add description to child entry
- (expect SUCCESS)
- #@TestPostamble
- #@TestResult Success if the servers synchronised and the aci
- correctly applied after replication
- -->
- <testcase name="getTestCaseName('Modify_add ACI')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: ACI: Modify_add ACI. Check ACI replication \
- over a modify_add.'
- </message>
-
- <script>
- myAci = "(targetattr=\"description\")(version 3.0; acl \"Allow ACI-user access to description\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
- mySn = 'ACI repl user'
- myUserpassword = 'userPwd'
-
- myEntry = Entry('cn=ACI user', synchroSuffix)
- myEntry.addAttr('sn', mySn)
- myEntry.addAttr('userpassword', myUserpassword)
-
- myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
- </script>
-
- <!-- Add user entry to "master" server -->
- <message>
- 'Add user entry %s' % myEntry.getDn()
- </message>
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
<sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- myDescription = 'He was a serious opium adict - %s' % i
- </script>
-
- <message>
- 'Binding as "%s", add description %s to entry %s on \
- server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
- Rights)' % \
- (myEntry.getDn(), myDescription, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'DNToModify' : myTargetEntryDn,
- 'attributeName' : 'description',
- 'newAttributeValue' : myDescription,
- 'changetype' : 'add',
- 'expectedRC' : 50
- }
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
</call>
- </sequence>
- </iterate>
-
- <!-- Add aci to entry ou=People,o=example on "master" server:
- ! (targetattr="description")(version 3.0; acl
- ! "Allow ACI-user access to description"; allow (all)
- ! userdn="ldap:///cn=ACI user,ou=People,o=example";)
- -->
- <message>
- 'Add ACI to entry ou=People,%s: \n%s' % (synchroSuffix, myAci)
- </message>
- <call function="'modifyAnAttribute'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'ou=People,%s' % synchroSuffix,
- 'attributeName' : 'aci',
- 'newAttributeValue' : myAci,
- 'changetype' : 'add'
- }
- </call>
-
- <message>
- '+++ New ACI +++\nAllow "%s" full access to all description \
- attributes under ou=People,%s.' % \
- (myEntry.getDn(), synchroSuffix)
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
+ </sequence>
+ <catch exception="'STAFException'">
<sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- myDescription = 'He was a serious opium adict - %s' % i
- </script>
-
- <message>
- 'Binding as "%s", add description %s to entry %s on \
- server %s:%s. -- Expect: SUCCESS' % \
- (myEntry.getDn(), myDescription, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'DNToModify' : myTargetEntryDn,
- 'attributeName' : 'description',
- 'newAttributeValue' : myDescription,
- 'changetype' : 'add'
- }
- </call>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
</sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
</sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication ACI Tests
- #@TestName Replication: ACI: Modify_replace ACI target
- #@TestID Modify_replace ACI target
- #@TestPurpose Check ACI replication over a modify_replace of
- the ACI target
- #@TestPreamble
- #@TestSteps Binding as user, add telephonenumber to child
- entry (expect ERROR 50)
- #@TestSteps Replace ACI on parent entry: allow user full
- access to all telephonenumber attributes
- #@TestSteps Binding as user, add telephonenumber to child
- entry (expect SUCCESS)
- #@TestPostamble
- #@TestResult Success if the servers synchronised and the aci
- correctly applied after replication
- -->
- <testcase name="getTestCaseName('Modify_replace ACI target')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: ACI: Modify_replace ACI target. Check ACI \
- replication over a modify_replace of the ACI target.'
- </message>
-
- <script>
- myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Allow ACI-user access to telephonenumber\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
- myUserpassword = 'userPwd'
-
- myEntry = Entry('cn=ACI user', synchroSuffix)
-
- myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
- </script>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- myTelephonenumber = '221-221-221-%s' % i
- </script>
-
- <message>
- 'Binding as "%s", add telephonenumber %s to entry %s on \
- server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
- Rights)' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'DNToModify' : myTargetEntryDn,
- 'attributeName' : 'telephonenumber',
- 'newAttributeValue' : myTelephonenumber,
- 'changetype' : 'add',
- 'expectedRC' : 50
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Replace aci on entry ou=People,o=example on "master" server:
- ! (targetattr="telephonenumber")(version 3.0; acl
- ! "Allow ACI-user access to telephonenumber"; allow (all)
- ! userdn="ldap:///cn=ACI user,ou=People,o=example";)
- -->
- <message>
- 'Replace ACI on entry ou=People,%s: \n%s' % \
- (synchroSuffix, myAci)
- </message>
- <call function="'modifyAnAttribute'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'ou=People,%s' % synchroSuffix,
- 'attributeName' : 'aci',
- 'newAttributeValue' : myAci,
- 'changetype' : 'replace'
- }
- </call>
-
- <message>
- '+++ New ACI +++\nAllow "%s" full access to all telephonenumber\
- attributes under ou=People,%s.' % \
- (myEntry.getDn(), synchroSuffix)
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- myTelephonenumber = '221-221-221-%s' % i
- </script>
-
- <message>
- 'Binding as "%s", add description %s to entry %s on \
- server %s:%s. -- Expect: SUCCESS' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'DNToModify' : myTargetEntryDn,
- 'attributeName' : 'telephonenumber',
- 'newAttributeValue' : myTelephonenumber,
- 'changetype' : 'add'
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication ACI Tests
- #@TestName Replication: ACI: Modify_replace ACI permission
- #@TestID Modify_replace ACI permission
- #@TestPurpose Check ACI replication over a modify_replace of
- the ACI permission
- #@TestPreamble
- #@TestSteps Binding as user, compare telephonenumber value
- to child entry (expect SUCCESS)
- #@TestSteps Replace ACI on parent entry: deny user access to
- telephonenumber attributes
- #@TestSteps Binding as user, compare telephonenumber value
- to child entry (expect ERROR 50)
- #@TestPostamble
- #@TestResult Success if the servers synchronised and the aci
- correctly applied after replication
- -->
- <testcase name="getTestCaseName('Modify_replace ACI permission')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: ACI: Modify_replace ACI permission. Check ACI \
- replication over a modify_replace of the ACI permission.'
- </message>
-
- <script>
- myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI-user access to telephonenumber\"; deny (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
- myUserpassword = 'userPwd'
-
- myEntry = Entry('cn=ACI user', synchroSuffix)
-
- myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
- myTelephonenumber = '+1 408 555 6789'
- </script>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- </script>
-
- <message>
- 'Binding as "%s", compare telephonenumber:%s value to \
- entry %s on server %s:%s. -- Expect: SUCCESS' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
-
- <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
- ! uid=sholmes,ou=People,o=example -->
- <call function="'ldapCompareWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'dsDn' : ['telephonenumber:%s' % \
- myTelephonenumber, myTargetEntryDn],
- 'expectedRC' : 0
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Replace aci on entry ou=People,o=example on "master" server:
- ! (targetattr="telephonenumber")(version 3.0; acl
- ! "Deny ACI-user access to telephonenumber"; deny (all)
- ! userdn="ldap:///cn=ACI user,ou=People,o=example";)
- -->
- <message>
- 'Replace ACI on entry ou=People,%s: \n%s' % \
- (synchroSuffix, myAci)
- </message>
- <call function="'modifyAnAttribute'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'ou=People,%s' % synchroSuffix,
- 'attributeName' : 'aci',
- 'newAttributeValue' : myAci,
- 'changetype' : 'replace'
- }
- </call>
-
- <message>
- '+++ New ACI +++\nDeny "%s" access to all telephonenumber \
- attributes under ou=People,%s.' % \
- (myEntry.getDn(), synchroSuffix)
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- </script>
-
- <message>
- 'Binding as "%s", compare telephonenumber:%s value to \
- entry %s on server %s:%s. -- Expect: ERROR 50 \
- (Insufficient Access Rights)' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
-
- <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
- ! uid=sholmes,ou=People,o=example -->
- <call function="'ldapCompareWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'dsDn' : ['telephonenumber:%s' % \
- myTelephonenumber, myTargetEntryDn],
- 'expectedRC' : 50
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication ACI Tests
- #@TestName Replication: ACI: Modify_replace ACI bind rule
- #@TestID Modify_replace ACI bind rule
- #@TestPurpose Check ACI replication over a modify_replace of
- the ACI bind rule
- #@TestPreamble Add new user entry
- #@TestSteps Binding as new user, compare telephonenumber
- value to child entry (expect SUCCESS)
- #@TestSteps Replace ACI on parent entry: deny users with
- a given sn access to telephonenumber attributes
- #@TestSteps Binding as new user, compare telephonenumber
- value to child entry (expect ERROR 50)
- #@TestPostamble
- #@TestResult Success if the servers synchronised and the aci
- correctly applied after replication
- -->
- <testcase name="getTestCaseName('Modify_replace ACI bind rule')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: ACI: Modify_replace ACI bind rule. Check ACI \
- replication over a modify_replace of the ACI bind rule.'
- </message>
-
- <script>
- mySn = 'ACI repl user'
- myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
- myUserpassword = 'secondUserPwd'
-
- myEntry = Entry('cn=Second ACI user', synchroSuffix)
- myEntry.addAttr('sn', mySn)
- myEntry.addAttr('userpassword', myUserpassword)
-
- myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
- myTelephonenumber = '+1 408 555 6789'
- </script>
-
- <!-- Add user entry to "master" server -->
- <message>
- 'Add user entry %s' % myEntry.getDn()
- </message>
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- </script>
-
- <message>
- 'Binding as "%s", compare telephonenumber:%s value to \
- entry %s on server %s:%s. -- Expect: SUCCESS' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
-
- <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
- ! uid=sholmes,ou=People,o=example -->
- <call function="'ldapCompareWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'dsDn' : ['telephonenumber:%s' % \
- myTelephonenumber, myTargetEntryDn],
- 'expectedRC' : 0
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Replace aci on entry ou=People,o=example on "master" server:
- ! (targetattr="telephonenumber")(version 3.0; acl
- ! "Deny ACI repl users access to telephonenumber"; deny (all)
- ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
- -->
- <message>
- 'Replace ACI on entry ou=People,%s: \n%s' % \
- (synchroSuffix, myAci)
- </message>
- <call function="'modifyAnAttribute'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'ou=People,%s' % synchroSuffix,
- 'attributeName' : 'aci',
- 'newAttributeValue' : myAci,
- 'changetype' : 'replace'
- }
- </call>
-
- <message>
- '+++ New ACI +++\nDeny users with (sn=%s) access to all \
- telephonenumber attributes under ou=People,%s.' % \
- (mySn, synchroSuffix)
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- </script>
-
- <message>
- 'Binding as "%s", compare telephonenumber:%s value to \
- entry %s on server %s:%s. -- Expect: ERROR 50 \
- (Insufficient Access Rights)' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
-
- <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
- ! uid=sholmes,ou=People,o=example -->
- <call function="'ldapCompareWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'dsDn' : ['telephonenumber:%s' % \
- myTelephonenumber, myTargetEntryDn],
- 'expectedRC' : 50
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication ACI Tests
- #@TestName Replication: ACI: Bypass-acl privilege
- #@TestID Bypass-acl privilege
- #@TestPurpose Check the bypass-acl privilege is replicated and
- successfully applied over the topology
- #@TestPreamble
- #@TestSteps Binding as new user, compare telephonenumber
- value to child entry (expect ERROR 50)
- #@TestSteps Add ds-privilege-name:bypass-acl to new user
- #@TestSteps Binding as new user, compare telephonenumber
- value to child entry (expect SUCCESS)
- #@TestPostamble
- #@TestResult Success if the servers synchronised and the aci
- correctly applied after replication
- -->
- <testcase name="getTestCaseName('Bypass-acl privilege')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: ACI: Bypass-acl privilege. Check the bypass-acl \
- privilege is replicated and successfully applied over the \
- topology'
- </message>
-
- <script>
- myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
- myUserpassword = 'secondUserPwd'
- myPrivilege = 'bypass-acl'
-
- myEntry = Entry('cn=Second ACI user', synchroSuffix)
-
- myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
- myTelephonenumber = '+1 408 555 6789'
- </script>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- </script>
-
- <message>
- 'Binding as "%s", compare telephonenumber:%s value to \
- entry %s on server %s:%s. -- Expect: ERROR 50 \
- (Insufficient Access Rights)' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
-
- <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
- ! uid=sholmes,ou=People,o=example -->
- <call function="'ldapCompareWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'dsDn' : ['telephonenumber:%s' % \
- myTelephonenumber, myTargetEntryDn],
- 'expectedRC' : 50
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Add bypass-acl privilege to new user entry -->
- <message>
- 'Add %s privilege to entry %s: \n' % \
- (myPrivilege, myEntry.getDn())
- </message>
- <call function="'modifyAnAttribute'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'attributeName' : 'ds-privilege-name',
- 'newAttributeValue' : myPrivilege,
- 'changetype' : 'add'
- }
- </call>
-
- <message>
- '+++ Active ACI +++\nDeny users with (sn=%s) access to all \
- telephonenumber attributes under ou=People,%s.' % \
- (mySn, synchroSuffix)
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- </script>
-
- <message>
- 'Binding as "%s", compare telephonenumber:%s value to \
- entry %s on server %s:%s. -- Expect: SUCCESS' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
-
- <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
- ! uid=sholmes,ou=People,o=example -->
- <call function="'ldapCompareWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'dsDn' : ['telephonenumber:%s' % \
- myTelephonenumber, myTargetEntryDn],
- 'expectedRC' : 0
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication ACI Tests
- #@TestName Replication: ACI: Modify_delete ACI
- #@TestID Modify_delete ACI
- #@TestPurpose Check ACI replication over a modify_delete
- #@TestPreamble
- #@TestSteps Binding as user, compare telephonenumber value
- to child entry (expect ERROR 50)
- #@TestSteps Delete ACI on parent entry
- #@TestSteps Binding as user, compare telephonenumber value
- to child entry (expect SUCCESS)
- #@TestPostamble
- #@TestResult Success if the servers synchronised and the aci
- correctly applied after replication
- -->
- <testcase name="getTestCaseName('Modify_delete ACI')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: ACI: Modify_delete ACI. Check ACI \
- replication over a modify_delete.'
- </message>
-
- <script>
- myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
- myUserpassword = 'userPwd'
-
- myEntry = Entry('cn=ACI user', synchroSuffix)
-
- myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
- myTelephonenumber = '+1 408 555 6789'
- </script>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- </script>
-
- <message>
- 'Binding as "%s", compare telephonenumber:%s value to \
- entry %s on server %s:%s. -- Expect: ERROR 50 \
- (Insufficient Access Rights)' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
-
- <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
- ! uid=sholmes,ou=People,o=example -->
- <call function="'ldapCompareWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'dsDn' : ['telephonenumber:%s' % \
- myTelephonenumber, myTargetEntryDn],
- 'expectedRC' : 50
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Delete aci on entry ou=People,o=example on "master" server:
- ! (targetattr="telephonenumber")(version 3.0; acl
- ! "Deny ACI repl users access to telephonenumber"; deny (all)
- ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
- -->
- <message>
- 'Delete ACI on entry ou=People,%s: \n%s' % \
- (synchroSuffix, myAci)
- </message>
- <call function="'modifyAnAttribute'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'ou=People,%s' % synchroSuffix,
- 'attributeName' : 'aci',
- 'newAttributeValue' : myAci,
- 'changetype' : 'delete'
- }
- </call>
-
- <message>
- '+++ New ACI +++\nNo aci in ou=People,%s.' % synchroSuffix
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- </script>
-
- <message>
- 'Binding as "%s", compare telephonenumber:%s value to \
- entry %s on server %s:%s. -- Expect: SUCCESS' % \
- (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
- server.getHostname(), server.getPort())
- </message>
-
- <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
- ! uid=sholmes,ou=People,o=example -->
- <call function="'ldapCompareWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : myEntry.getDn(),
- 'dsInstancePswd' : myUserpassword,
- 'dsDn' : ['telephonenumber:%s' % \
- myTelephonenumber, myTargetEntryDn],
- 'expectedRC' : 0
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication ACI' }
- </call>
-
- <call function="'testSuite_Postamble'"/>
-
- </sequence>
-
+ </finally>
+
+ </try>
</block>
-
</sequence>
-
</function>
-
</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci_tests.xml
new file mode 100644
index 0000000..fd6faaa
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/aci/aci_tests.xml
@@ -0,0 +1,1162 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Add entry with ACI
+ #@TestID Add entry with ACI
+ #@TestPurpose Check ACI replication over an entry add
+ #@TestPreamble
+ #@TestSteps Add entry with ACI: deny self description write
+ #@TestSteps Binding as entry, add givenname to entry
+ (expect SUCCESS)
+ #@TestSteps Binding as entry, add description to entry
+ (expect ERROR 50)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <function name="replication_aci_001" scope="local">
+ <testcase name="getTestCaseName('Add entry with ACI')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: ACI: Add entry with ACI. Check ACI replication \
+ over an entry add.'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"description\")(version 3.0; acl \"Deny Self Description Write\"; deny (write) userdn=\"ldap:///self\";)"
+ myUserpassword = 'entryPwd'
+
+ myEntry = Entry('cn=ACI entry', synchroSuffix)
+ myEntry.addAttr('sn', 'ACI repl tests')
+ myEntry.addAttr('aci', myAci)
+ myEntry.addAttr('userpassword', myUserpassword)
+ </script>
+
+ <!-- Add entry to "master" server with aci:
+ ! (targetattr="description")(version 3.0; acl
+ ! "Deny Self Description Write"; deny (write)
+ ! userdn="ldap:///self";)
+ -->
+ <message>
+ 'Add entry %s with ACI: \n%s' % (myEntry.getDn(), myAci)
+ </message>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nDeny "%s" the access to write its own \
+ description attribute.' % myEntry.getDn()
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myGivenname = 'My own GIVENNAME value %s' % i
+ myDescription = 'My own DESCRIPTION value %s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add givenname %s to entry %s on server \
+ %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myGivenname, myEntry.getDn(),
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : 'givenname',
+ 'newAttributeValue' : myGivenname,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <message>
+ 'Binding as "%s", add description %s to entry %s on \
+ server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
+ Rights)' % \
+ (myEntry.getDn(), myDescription, myEntry.getDn(),
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : 'description',
+ 'newAttributeValue' : myDescription,
+ 'changetype' : 'add',
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_add ACI
+ #@TestID Modify_add ACI
+ #@TestPurpose Check ACI replication over a modify_add
+ #@TestPreamble Add a user entry to suffix
+ #@TestSteps Binding as user, add description to child entry
+ (expect ERROR 50)
+ #@TestSteps Add ACI to parent entry: allow user full access
+ to all description attributes
+ #@TestSteps Binding as user, add description to child entry
+ (expect SUCCESS)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <function name="replication_aci_002" scope="local">
+ <testcase name="getTestCaseName('Modify_add ACI')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: ACI: Modify_add ACI. Check ACI replication \
+ over a modify_add.'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"description\")(version 3.0; acl \"Allow ACI-user access to description\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
+ mySn = 'ACI repl user'
+ myUserpassword = 'userPwd'
+
+ myEntry = Entry('cn=ACI user', synchroSuffix)
+ myEntry.addAttr('sn', mySn)
+ myEntry.addAttr('userpassword', myUserpassword)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ </script>
+
+ <!-- Add user entry to "master" server -->
+ <message>
+ 'Add user entry %s' % myEntry.getDn()
+ </message>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myDescription = 'He was a serious opium adict - %s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add description %s to entry %s on \
+ server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
+ Rights)' % \
+ (myEntry.getDn(), myDescription, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myTargetEntryDn,
+ 'attributeName' : 'description',
+ 'newAttributeValue' : myDescription,
+ 'changetype' : 'add',
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Add aci to entry ou=People,o=example on "master" server:
+ ! (targetattr="description")(version 3.0; acl
+ ! "Allow ACI-user access to description"; allow (all)
+ ! userdn="ldap:///cn=ACI user,ou=People,o=example";)
+ -->
+ <message>
+ 'Add ACI to entry ou=People,%s: \n%s' % (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nAllow "%s" full access to all description \
+ attributes under ou=People,%s.' % \
+ (myEntry.getDn(), synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myDescription = 'He was a serious opium adict - %s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add description %s to entry %s on \
+ server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myDescription, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myTargetEntryDn,
+ 'attributeName' : 'description',
+ 'newAttributeValue' : myDescription,
+ 'changetype' : 'add'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_replace ACI target
+ #@TestID Modify_replace ACI target
+ #@TestPurpose Check ACI replication over a modify_replace of
+ the ACI target
+ #@TestPreamble
+ #@TestSteps Binding as user, add telephonenumber to child
+ entry (expect ERROR 50)
+ #@TestSteps Replace ACI on parent entry: allow user full
+ access to all telephonenumber attributes
+ #@TestSteps Binding as user, add telephonenumber to child
+ entry (expect SUCCESS)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <function name="replication_aci_003" scope="local">
+ <testcase name="getTestCaseName('Modify_replace ACI target')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: ACI: Modify_replace ACI target. Check ACI \
+ replication over a modify_replace of the ACI target.'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Allow ACI-user access to telephonenumber\"; allow (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
+ myUserpassword = 'userPwd'
+
+ myEntry = Entry('cn=ACI user', synchroSuffix)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ </script>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myTelephonenumber = '221-221-221-%s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add telephonenumber %s to entry %s on \
+ server %s:%s. -- Expect: ERROR 50 (Insufficient Access \
+ Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myTargetEntryDn,
+ 'attributeName' : 'telephonenumber',
+ 'newAttributeValue' : myTelephonenumber,
+ 'changetype' : 'add',
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Replace aci on entry ou=People,o=example on "master" server:
+ ! (targetattr="telephonenumber")(version 3.0; acl
+ ! "Allow ACI-user access to telephonenumber"; allow (all)
+ ! userdn="ldap:///cn=ACI user,ou=People,o=example";)
+ -->
+ <message>
+ 'Replace ACI on entry ou=People,%s: \n%s' % \
+ (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nAllow "%s" full access to all telephonenumber\
+ attributes under ou=People,%s.' % \
+ (myEntry.getDn(), synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ myTelephonenumber = '221-221-221-%s' % i
+ </script>
+
+ <message>
+ 'Binding as "%s", add description %s to entry %s on \
+ server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'DNToModify' : myTargetEntryDn,
+ 'attributeName' : 'telephonenumber',
+ 'newAttributeValue' : myTelephonenumber,
+ 'changetype' : 'add'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_replace ACI permission
+ #@TestID Modify_replace ACI permission
+ #@TestPurpose Check ACI replication over a modify_replace of
+ the ACI permission
+ #@TestPreamble
+ #@TestSteps Binding as user, compare telephonenumber value
+ to child entry (expect SUCCESS)
+ #@TestSteps Replace ACI on parent entry: deny user access to
+ telephonenumber attributes
+ #@TestSteps Binding as user, compare telephonenumber value
+ to child entry (expect ERROR 50)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <function name="replication_aci_004" scope="local">
+ <testcase name="getTestCaseName('Modify_replace ACI permission')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: ACI: Modify_replace ACI permission. Check ACI \
+ replication over a modify_replace of the ACI permission.'
+ </message>
+
+ <script>
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI-user access to telephonenumber\"; deny (all) userdn=\"ldap:///cn=ACI user,ou=People,%s\";)" % synchroSuffix
+ myUserpassword = 'userPwd'
+
+ myEntry = Entry('cn=ACI user', synchroSuffix)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ myTelephonenumber = '+1 408 555 6789'
+ </script>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Replace aci on entry ou=People,o=example on "master" server:
+ ! (targetattr="telephonenumber")(version 3.0; acl
+ ! "Deny ACI-user access to telephonenumber"; deny (all)
+ ! userdn="ldap:///cn=ACI user,ou=People,o=example";)
+ -->
+ <message>
+ 'Replace ACI on entry ou=People,%s: \n%s' % \
+ (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nDeny "%s" access to all telephonenumber \
+ attributes under ou=People,%s.' % \
+ (myEntry.getDn(), synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: ERROR 50 \
+ (Insufficient Access Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_replace ACI bind rule
+ #@TestID Modify_replace ACI bind rule
+ #@TestPurpose Check ACI replication over a modify_replace of
+ the ACI bind rule
+ #@TestPreamble Add new user entry
+ #@TestSteps Binding as new user, compare telephonenumber
+ value to child entry (expect SUCCESS)
+ #@TestSteps Replace ACI on parent entry: deny users with
+ a given sn access to telephonenumber attributes
+ #@TestSteps Binding as new user, compare telephonenumber
+ value to child entry (expect ERROR 50)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <function name="replication_aci_005" scope="local">
+ <testcase name="getTestCaseName('Modify_replace ACI bind rule')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: ACI: Modify_replace ACI bind rule. Check ACI \
+ replication over a modify_replace of the ACI bind rule.'
+ </message>
+
+ <script>
+ mySn = 'ACI repl user'
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
+ myUserpassword = 'secondUserPwd'
+
+ myEntry = Entry('cn=Second ACI user', synchroSuffix)
+ myEntry.addAttr('sn', mySn)
+ myEntry.addAttr('userpassword', myUserpassword)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ myTelephonenumber = '+1 408 555 6789'
+ </script>
+
+ <!-- Add user entry to "master" server -->
+ <message>
+ 'Add user entry %s' % myEntry.getDn()
+ </message>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Replace aci on entry ou=People,o=example on "master" server:
+ ! (targetattr="telephonenumber")(version 3.0; acl
+ ! "Deny ACI repl users access to telephonenumber"; deny (all)
+ ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
+ -->
+ <message>
+ 'Replace ACI on entry ou=People,%s: \n%s' % \
+ (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nDeny users with (sn=%s) access to all \
+ telephonenumber attributes under ou=People,%s.' % \
+ (mySn, synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: ERROR 50 \
+ (Insufficient Access Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Bypass-acl privilege
+ #@TestID Bypass-acl privilege
+ #@TestPurpose Check the bypass-acl privilege is replicated and
+ successfully applied over the topology
+ #@TestPreamble
+ #@TestSteps Binding as new user, compare telephonenumber
+ value to child entry (expect ERROR 50)
+ #@TestSteps Add ds-privilege-name:bypass-acl to new user
+ #@TestSteps Binding as new user, compare telephonenumber
+ value to child entry (expect SUCCESS)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <function name="replication_aci_006" scope="local">
+ <testcase name="getTestCaseName('Bypass-acl privilege')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: ACI: Bypass-acl privilege. Check the bypass-acl \
+ privilege is replicated and successfully applied over the \
+ topology'
+ </message>
+
+ <script>
+ mySn = 'ACI repl user'
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
+ myUserpassword = 'secondUserPwd'
+ myPrivilege = 'bypass-acl'
+
+ myEntry = Entry('cn=Second ACI user', synchroSuffix)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ myTelephonenumber = '+1 408 555 6789'
+ </script>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: ERROR 50 \
+ (Insufficient Access Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Add bypass-acl privilege to new user entry -->
+ <message>
+ 'Add %s privilege to entry %s: \n' % \
+ (myPrivilege, myEntry.getDn())
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : 'ds-privilege-name',
+ 'newAttributeValue' : myPrivilege,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <message>
+ '+++ Active ACI +++\nDeny users with (sn=%s) access to all \
+ telephonenumber attributes under ou=People,%s.' % \
+ (mySn, synchroSuffix)
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication ACI Tests
+ #@TestName Replication: ACI: Modify_delete ACI
+ #@TestID Modify_delete ACI
+ #@TestPurpose Check ACI replication over a modify_delete
+ #@TestPreamble
+ #@TestSteps Binding as user, compare telephonenumber value
+ to child entry (expect ERROR 50)
+ #@TestSteps Delete ACI on parent entry
+ #@TestSteps Binding as user, compare telephonenumber value
+ to child entry (expect SUCCESS)
+ #@TestPostamble
+ #@TestResult Success if the servers synchronised and the aci
+ correctly applied after replication
+ -->
+ <function name="replication_aci_007" scope="local">
+ <testcase name="getTestCaseName('Modify_delete ACI')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: ACI: Modify_delete ACI. Check ACI \
+ replication over a modify_delete.'
+ </message>
+
+ <script>
+ mySn = 'ACI repl user'
+ myAci = "(targetattr=\"telephonenumber\")(version 3.0; acl \"Deny ACI repl users access to telephonenumber\"; deny (all) userdn=\"ldap:///%s??sub?(sn=%s)\";)" % (synchroSuffix, mySn)
+ myUserpassword = 'userPwd'
+
+ myEntry = Entry('cn=ACI user', synchroSuffix)
+
+ myTargetEntryDn = 'uid=sholmes,ou=People,%s' % synchroSuffix
+ myTelephonenumber = '+1 408 555 6789'
+ </script>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: ERROR 50 \
+ (Insufficient Access Rights)' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 50
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Delete aci on entry ou=People,o=example on "master" server:
+ ! (targetattr="telephonenumber")(version 3.0; acl
+ ! "Deny ACI repl users access to telephonenumber"; deny (all)
+ ! userdn="ldap:///o=example??sub?(sn=ACI repl user)";)
+ -->
+ <message>
+ 'Delete ACI on entry ou=People,%s: \n%s' % \
+ (synchroSuffix, myAci)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'ou=People,%s' % synchroSuffix,
+ 'attributeName' : 'aci',
+ 'newAttributeValue' : myAci,
+ 'changetype' : 'delete'
+ }
+ </call>
+
+ <message>
+ '+++ New ACI +++\nNo aci in ou=People,%s.' % synchroSuffix
+ </message>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Binding as "%s", compare telephonenumber:%s value to \
+ entry %s on server %s:%s. -- Expect: SUCCESS' % \
+ (myEntry.getDn(), myTelephonenumber, myTargetEntryDn,
+ server.getHostname(), server.getPort())
+ </message>
+
+ <!-- Compare 'telephonenumber:+1 408 555 6789' value to entry
+ ! uid=sholmes,ou=People,o=example -->
+ <call function="'ldapCompareWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : myEntry.getDn(),
+ 'dsInstancePswd' : myUserpassword,
+ 'dsDn' : ['telephonenumber:%s' % \
+ myTelephonenumber, myTargetEntryDn],
+ 'expectedRC' : 0
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic.xml
index 847fd34..3b97692 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic.xml
@@ -7,2061 +7,165 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2007-2010 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
-
<defaultcall function="replication_basic"/>
-
- <function name="replication_basic">
-
+ <function name="replication_basic" scope="local">
<sequence>
+ <block name="'replication_basic'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'basic'
+
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication Basic'
+ </script>
- <block name="'basic'">
-
- <sequence>
-
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication Basic Tests
- #@TestSuitePurpose Verify that the basic operations are replicated
- correctly between two serrvers.
- #@TestSuiteID Basic Tests
- #@TestSuiteGroup Basic
- #@TestGroup Replication
- #@TestScript replication_basic.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'" >
- { 'label' : 'Replication Basic' }
- </call>
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/basic/replication_basic_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_basic_setup'" />
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Add Entry
- #@TestID Add Entry
- #@TestPurpose Check that an entry add is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Add root suffix entry
- #@TestPostamble
- #@TestResult Success if trees synchronised over the topology
- -->
- <testcase name="getTestCaseName('Add Entry')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Add Entry. Check that an added entry is \
- well propagated by replication.'
- </message>
-
- <!-- Modify "master" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication_add_root_suffix.ldif' \
- % client.getTmpDir()
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry
- #@TestID Modify Entry
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Add entry on server
- #@TestSteps Modify entry
- #@TestSteps Check modify worked on server
- #@TestPostamble
- #@TestResult Success if modify worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName('Modify Entry')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry. Check that an entry modify \
- is well propagated by replication.'
- </message>
-
-
- <!-- Modify "master" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication_add_single.ldif' \
- % client.getTmpDir()
- }
- </call>
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsFilename' : '%s/replication_mod.ldif' \
- % client.getTmpDir()
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : entryDn,
- 'dsFilter' : '%s=%s' % (attr_type,attr_value)
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Delete Entry
- #@TestID Delete Entry
- #@TestPurpose Check that an entry delete is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Delete entry
- #@TestSteps Check delete worked on server
- #@TestPostamble
- #@TestResult Success if delete worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName('Delete Entry')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Delete Entry. Check that an entry delete \
- is well propagated by replication.'
- </message>
-
-
- <!-- Modify "master" server -->
- <call function="'DeleteEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : entryDn
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : entryDn,
- 'dsFilter' : 'objectclass=*',
- 'expectedRC' : 32
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Add Multiple Entries
- #@TestID Add Multiple Entries
- #@TestPurpose Check that a multiple-entry add is well
- propagated by replication.
- #@TestPreamble Delete root suffix entry
- #@TestSteps Add multiple entries
- #@TestPostamble
- #@TestResult Success if trees synchronised over the topology
- -->
- <testcase name="getTestCaseName('Add Multiple Entries')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Add Multiple Entries. Check that a \
- multiple-entry add is well propagated by replication.'
- </message>
-
- <!-- Delete the root entry, as it is already present in
- Example.ldif file -->
- <call function="'DeleteEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : synchroSuffix
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/Example.ldif' \
- % master.getDataDir()
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - add single
- attribute
- #@TestID Modify Entry - add single attribute
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Add description attribute to entry
- #@TestSteps Check modify worked
- #@TestPostamble
- #@TestResult Success if modify worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - add single attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - add single attribute. \
- Check that an entry modify is well propagated by replication.'
- </message>
-
- <!-- Modify "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'uid=tmorris, ou=People,%s' \
- % synchroSuffix,
- 'attributeName' : 'description',
- 'newAttributeValue' : ' ',
- 'changetype' : 'add'
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=tmorris, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'description=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - add single
- value
- #@TestID Modify Entry - add single value
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Add single-valued attribute to entry
- #@TestSteps Check modify worked
- #@TestPostamble
- #@TestResult Success if modify worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName('Modify Entry - add single value')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - add single value. Check \
- that an entry modify is well propagated by replication.'
- </message>
-
- <!-- Modify "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'uid=tmorris, ou=People,%s' \
- % synchroSuffix,
- 'attributeName' : 'departmentnumber',
- 'newAttributeValue' : '5203214400',
- 'changetype' : 'add'
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=tmorris, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'departmentnumber=5203214400'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - delete single
- attribute
- #@TestID Modify Entry - delete single attribute
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Delete attribute in entry
- #@TestSteps Check delete worked
- #@TestPostamble
- #@TestResult Success if delete worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - delete single attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - delete single attribute. \
- Check that an entry modify is well propagated by replication.'
- </message>
-
-
- <script>
- filename = 'replication_mod_delete.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- dn = 'uid=smason, ou=People,%s' % synchroSuffix
- modif = 'delete'
- attrType = 'roomNumber'
- attrValue = None
- write_replication_mod_ldif_file(filePath, dn, modif, attrType,
- attrValue)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' \
- % (filename,local.temp,client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=smason, ou=People,%s' % synchroSuffix,
- 'dsFilter' : 'roomNumber=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 0
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - delete single
- value
- #@TestID Modify Entry - delete single value
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Delete single attribute value in entry
- #@TestSteps Check delete worked
- #@TestPostamble
- #@TestResult Success if delete worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - delete single value')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - delete single value. \
- Check that an entry modify is well propagated by replication.'
- </message>
-
- <!-- Modify "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'uid=jwalker, ou=People,%s' \
- % synchroSuffix,
- 'attributeName' : 'roomNumber',
- 'newAttributeValue' : '3915',
- 'changetype' : 'delete'
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=jwalker, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'roomNumber=3915'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 0
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - add multiple
- values
- #@TestID Modify Entry - add multiple values
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Add multiple-valued attribute to entry
- #@TestSteps Check add worked
- #@TestPostamble
- #@TestResult Success if add worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - add multiple values')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - add multiple values. \
- Check that an entry modify is well propagated by replication.'
- </message>
-
- <script>
- valuesToAdd = []
- valuesToAdd.append('postaladdress:Residence Parc Europe')
- valuesToAdd.append('postaladdress:Appartement #6')
- valuesToAdd.append('postaladdress:31 Rue General Mangin')
- valuesToAdd.append('postaladdress:38100 Grenoble')
- </script>
-
- <!-- Modify "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'listAttributes' : valuesToAdd,
- 'changetype' : 'add'
- }
- </call>
-
- <script>
- filter1 = '(postaladdress=Residence Parc Europe)'
- filter2 = '(postaladdress=Appartement #6)'
- filter3 = '(postaladdress=31 Rue General Mangin)'
- filter4 = '(postaladdress=38100 Grenoble)'
- </script>
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : '&%s%s%s%s' \
- % (filter1, filter2, filter3, filter4)
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - delete
- multiple values
- #@TestID Modify Entry - delete multiple values
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Delete multiple values in same attribute
- #@TestSteps Check delete worked
- #@TestPostamble
- #@TestResult Success if delete worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - delete multiple values')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - delete multiple values. \
- Check that an entry modify is well propagated by replication.'
- </message>
-
-
- <script>
- valuesToDelete = []
- valuesToDelete.append('postaladdress:Appartement #6')
- valuesToDelete.append('postaladdress:38100 Grenoble')
- </script>
-
- <!-- Modify "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'listAttributes' : valuesToDelete,
- 'changetype' : 'delete'
- }
- </call>
-
- <script>
- filter1 = '(postaladdress=Appartement #6)'
- filter2 = '(postaladdress=38100 Grenoble)'
- </script>
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : '|%s%s' % (filter1, filter2)
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 0
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - replace
- multiple values
- #@TestID Modify Entry - replace multiple values
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Replace multiple values in same attribute
- #@TestSteps Check replace worked
- #@TestPostamble
- #@TestResult Success if replace worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - replace multiple values')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - replace multiple values. \
- Check that an entry modify is well propagated by replication.'
- </message>
-
-
- <script>
- valuesToReplace = []
- valuesToReplace.append('postaladdress: Residence Letilleuil')
- valuesToReplace.append('postaladdress: 18 rue Nicolas Chorier')
- </script>
-
- <!-- Modify "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'listAttributes' : valuesToReplace,
- 'changetype' : 'replace'
- }
- </call>
-
- <script>
- filter1 = '(postaladdress=Residence Letilleuil)'
- filter2 = '(postaladdress=18 rue Nicolas Chorier)'
- </script>
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : '&%s%s' % (filter1, filter2)
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - add single
- value to multiple valued attribute
- #@TestID Modify Entry - add single value to multiple
- valued attribute
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Add single value to multiple-valued attribute
- #@TestSteps Check value add worked
- #@TestPostamble
- #@TestResult Success if value add worked and trees
- synchronised over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - add single value to multiple valued attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - add single value to \
- multiple valued attribute. Check that an entry modify is well \
- propagated by replication.'
- </message>
-
-
- <script>
- valuesToAdd = []
- valuesToAdd.append('postaladdress:38000 Grenoble')
- </script>
-
- <!-- Modify "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'listAttributes' : valuesToAdd,
- 'changetype' : 'add'
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'postaladdress=38000 Grenoble'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - delete single
- value from multiple valued attribute
- #@TestID Modify Entry - delete single value from multiple
- valued attribute
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Delete single value from multiple-valued
- attribute
- #@TestSteps Check value delete worked
- #@TestPostamble
- #@TestResult Success if value delete worked and trees
- synchronised over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - delete single value from multiple valued attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - delete single value from \
- multiple valued attribute. Check that an entry modify is well \
- propagated by replication.'
- </message>
-
-
- <script>
- valuesToDelete = []
- valuesToDelete.append('postaladdress: Residence Letilleuil')
- </script>
-
- <!-- Modify "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'listAttributes' : valuesToDelete,
- 'changetype' : 'delete'
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'postaladdress=Residence Letilleuil'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 0
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - replace case
- sensitive attribute
- #@TestID Modify Entry - replace case sensitive attribute
- #@TestPurpose Check that case sensitive attribute
- modifications are replicated.
- #@TestPreamble
- #@TestSteps Add entry
- #@TestSteps Replace description attribute in entry
- #@TestSteps Check replace worked
- #@TestPostamble
- #@TestResult Success if replace worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - replace case sensitive attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - replace case sensitive \
- attribute. Check that case sensitive attribute modifications \
- are replicated.'
- </message>
-
-
- <!-- Modify "master" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
- % master.getDataDir()
- }
- </call>
-
- <script>
- value = 'Profession Tap Fitter and Plumber'
- valuesToReplace = []
- valuesToReplace.append('description: %s' % value)
- </script>
-
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'uid=tfitter, ou=People,%s' \
- % synchroSuffix,
- 'listAttributes' : valuesToReplace,
- 'changetype' : 'replace'
- }
- </call>
-
- <script>
- filter = 'description=%s' % value
- </script>
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=tfitter, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : filter
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - replace
- userpassword
- #@TestID Modify Entry - replace userpassword
- #@TestPurpose Check replaced userpasswords are replicated.
- #@TestPreamble
- #@TestSteps Add user entry on server A
- #@TestSteps Bind as user with userpassword to server A
- #@TestSteps Replace user's userpassword
- #@TestSteps Bind as user with old userpassword to server B
- #@TestSteps Bind as user with new userpassword to server B
- #@TestPostamble
- #@TestResult Success if bind with old userpassword fails with
- LDAP_INVALID_CREDENTIALS error and bind with new
- user password suceeds and trees are synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - replace userpassword')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - replace userpassword. \
- Check replaced userpasswords are replicated.'
- </message>
-
- <!-- Add entry to "master" server -->
- <script>
- userDn = 'uid=pmoriarty, ou=People, %s' % synchroSuffix
- oldPassword = 'jajejijoju'
- newPassword = 'JUAJUAJUA'
+ <!--- Test Suite information
+ #@TestSuiteName Replication Basic Tests
+ #@TestSuitePurpose Verify that the basic operations are replicated
+ correctly between two serrvers.
+ #@TestSuiteID Basic Tests
+ #@TestSuiteGroup Basic
+ #@TestGroup Replication
+ #@TestScript replication_basic.xml
+ #@TestHTMLLink http://www.forgerock.org/
+ -->
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Professor')
- listAttr.append('sn:Moriarty')
- listAttr.append('cn:Professor Moriarty')
- listAttr.append('l:London')
- listAttr.append('userpassword:%s' % oldPassword)
- </script>
- <message>
- 'replace userpassword: add user entry %s' % userDn
- </message>
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr
- }
- </call>
-
- <!-- Check userDn can bind with oldPassword on "master" server -->
- <message>
- 'replace userpassword: bind on master using password %s' \
- % oldPassword
- </message>
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : userDn,
- 'dsInstancePswd' : oldPassword,
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'objectclass=*'
- }
- </call>
+ <call function="'testSuite_Preamble'"/>
- <!-- Replace userDn's oldPassword with newPassword on "master"
- server -->
- <message>
- 'replace userpassword: replace user password %s with %s' \
- % (oldPassword, newPassword)
- </message>
- <call function="'modifyAnAttribute'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : userDn,
- 'attributeName' : 'userpassword',
- 'newAttributeValue' : 'JUAJUAJUA',
- 'changetype' : 'replace'
- }
- </call>
-
- <script>
- consumer = consumerList[0]
- </script>
- <!-- Try binding as userDn with oldPassword on "consumer" server:
- ==> should fail with LDAP_INVALID_CREDENTIALS (49) error -->
- <message>
- 'replace userpassword: bind on consumer using old password %s :\
- should fail with error LDAP_INVALID_CREDENTIALS (49)' \
- % oldPassword
- </message>
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumer.getHostname(),
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : userDn,
- 'dsInstancePswd' : oldPassword,
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'objectclass=*',
- 'expectedRC' : 49
- }
- </call>
-
- <!-- Check userDn can bind with newPassword on "consumer"
- server -->
- <message>
- 'replace userpassword: bind on consumer using new password %s :\
- should pass' % newPassword
- </message>
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumer.getHostname(),
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : userDn,
- 'dsInstancePswd' : newPassword,
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'objectclass=*'
- }
- </call>
-
- <!-- Delete added entry as clean-up measure -->
- <message>
- 'replace userpassword: delete user entry %s on master' \
- % userDn
- </message>
- <call function="'DeleteEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : userDn
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - add binary
- attribute
- #@TestID Modify Entry - add binary attribute
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Add jpegPhoto attribute to entry with binary
- value
- #@TestSteps Check add worked
- #@TestPostamble
- #@TestResult Success if add worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - add binary attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - add binary attribute. \
- Check that an entry modify is well propagated by replication.'
- </message>
-
- <script>
- filename = 'replication_mod_add_binary.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- binaryFilePath = '%s/replication/photo1.uu' % source.data
- dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
- modif = 'add'
- attrType = 'jpegPhoto'
- write_replication_mod_binary_ldif_file(filePath, dn, modif,
- attrType, binaryFilePath)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' \
- % (filename,local.temp,client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'jpegPhoto=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - replace
- binary attribute
- #@TestID Modify Entry - replace binary attribute
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Replace jpegPhoto (binary) attribute value
- #@TestSteps Check replace worked
- #@TestPostamble
- #@TestResult Success if replace worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - replace binary attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - replace binary attribute. \
- Check that an entry modify is well propagated by replication.'
- </message>
-
- <script>
- filename = 'replication_mod_replace_binary.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- binaryFilePath = '%s/replication/photo2.uu' % source.data
- dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
- modif = 'replace'
- attrType = 'jpegPhoto'
- write_replication_mod_binary_ldif_file(filePath, dn, modif,
- attrType, binaryFilePath)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' \
- % (filename,local.temp,client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'jpegPhoto=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Modify Entry - delete binary
- attribute
- #@TestID Modify Entry - delete binary attribute
- #@TestPurpose Check that an entry modify is well propagated by
- replication.
- #@TestPreamble
- #@TestSteps Delete binary attribute jpegPhoto
- #@TestSteps Check delete worked
- #@TestPostamble
- #@TestResult Success if delete worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - delete binary attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Modify Entry - delete binary attribute. \
- Check that an entry modify is well propagated by replication.'
- </message>
-
-
- <script>
- filename = 'replication_mod_delete_binary.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
- modif = 'delete'
- attrType = 'jpegPhoto'
- attrValue = None
- write_replication_mod_ldif_file(filePath, dn, modif, attrType,
- attrValue)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' \
- % (filename,local.temp,client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'jpegPhoto=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 0
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Rename Entry
- #@TestID Rename Entry
- #@TestPurpose Check that a rename (modrdn) operation is well
- propagated by replication.
- #@TestPreamble
- #@TestSteps Rename entry
- #@TestSteps Check old dn entry no longer exists
- #@TestSteps Check new dn entry exists
- #@TestPostamble
- #@TestResult Success if rename worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName('Rename Entry')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Rename Entry. Check that a rename \
- (modrdn) operation is well propagated by replication.'
- </message>
-
- <script>
- filename = 'replication_modrdn.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix
- newrdn = 'uid=kvaughan2'
- newsuperior = None
- deleteoldrdn = 1
- write_replication_moddn_ldif_file(filePath, dn, newrdn,
- newsuperior, deleteoldrdn)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' \
- % (filename,local.temp,client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}" does
- NOT exist anymore -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=kvaughan, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'objectclass=*',
- 'expectedRC' : 32
- }
- </call>
-
- <!-- check that new entry
- "uid=kvaughan2, ou=People, ${DIRECTORY_BASE}" exists -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=kvaughan2, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'objectclass=*'
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Rename Entry (preserving old
- rdn)
- #@TestID Rename Entry (preserving old rdn)
- #@TestPurpose Check that a rename (modrdn) operation is well
- propagated by replication.
- #@TestPreamble
- #@TestSteps Rename entry
- #@TestSteps Check old dn entry no longer exists
- #@TestSteps Check new dn entry exists and contains old rdn
- #@TestPostamble
- #@TestResult Success if rename worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName('Rename Entry (preserving old rdn)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Rename Entry (preserving old rdn). \
- Check that a rename (modrdn) operation is well propagated by \
- replication.'
- </message>
-
- <script>
- filename = 'replication_modrdn_preserve.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- dn = 'uid=jwallace, ou=People,%s' % synchroSuffix
- newrdn = 'uid=igueye'
- newsuperior = None
- deleteoldrdn = 0
- write_replication_moddn_ldif_file(filePath, dn, newrdn,
- newsuperior, deleteoldrdn)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' \
- % (filename,local.temp,client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}" does
- NOT exist anymore -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'objectclass=*',
- 'expectedRC' : 32
- }
- </call>
-
- <!-- check that new entry
- "uid=igueye, ou=People, ${DIRECTORY_BASE}" exists -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=igueye, ou=People,%s' % synchroSuffix,
- 'dsFilter' : 'uid=jwallace'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength,
- 'result' : searchResult,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Rename Subtree
- #@TestID Rename Subtree
- #@TestPurpose Check that a subtree rename (moddn) operation is
- well propagated by replication.
- #@TestPreamble
- #@TestSteps Rename subtree
- #@TestSteps Check old subtree no longer exists
- #@TestSteps Check new subree exists
- #@TestPostamble
- #@TestResult Success if rename worked and trees synchronised
- over the topology
- -->
- <testcase name="getTestCaseName('Rename Subtree')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Rename Subtree. Check that a subtree \
- rename (moddn) operation is well propagated by replication.'
- </message>
-
- <script>
- filename = 'replication_moddn.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- dn = 'ou=People,%s' % synchroSuffix
- newrdn = 'ou=Special People'
- newsuperior = 'ou=Special Users,%s' % synchroSuffix
- deleteoldrdn = 0
- write_replication_moddn_ldif_file(filePath, dn, newrdn,
- newsuperior, deleteoldrdn)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' \
- % (filename,local.temp,client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}" does
- NOT exist anymore -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : 'uid=gfarmer, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'objectclass=*',
- 'expectedRC' : 32
- }
- </call>
-
- <script>
- base = 'uid=gfarmer, ou=Special People, ou=Special Users,%s' \
- % synchroSuffix
- </script>
- <!-- check that new entry
- "uid=gfarmer, ou=Special People, ou=Special Users,
- ${DIRECTORY_BASE}" exists -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsBaseDN' : base,
- 'dsFilter' : 'objectclass=*'
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Basic Tests
- #@TestName Replication: Basic: Add entry after restart
- #@TestID Add entry after restart
- #@TestPurpose Check entry add over secured replication after
- server restart
- #@TestPreamble
- #@TestSteps Restart servers
- #@TestSteps Add entry
- #@TestPostamble
- #@TestResult Success if trees synchronised over the topology
- -->
- <testcase name="getTestCaseName('Add entry after restart')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Basic: Add entry after restart. \
- Check entry add over secured replication after server restart'
- </message>
-
- <!-- Stop the servers in the topology -->
- <call function="'stopServers'">
- [_splitServerList]
- </call>
-
- <!-- Start the servers in the topology -->
- <call function="'startServers'">
- [_splitServerList]
- </call>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- userDn = 'uid=RESTART-iabizen-%s, %s' % \
- (i,synchroSuffix)
- </script>
-
- <!-- Add entry to one of the other servers -->
- <script>
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen-%s' % i)
- listAttr.append('sn:Abizen-%s' % i)
- listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
- listAttr.append('l:ICNC')
- </script>
+ <try>
+ <sequence>
+
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'" >
+ { 'label' : 'Replication Basic' }
+ </call>
- <call function="'addAnEntry'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr
- }
- </call>
-
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/basic/replication_basic_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_basic_setup'" />
+
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('basic/basic_tests')
+ </script>
+
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
+
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: Basic:'
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_basic_001')
+ testsList.append('replication_basic_002')
+ testsList.append('replication_basic_003')
+ testsList.append('replication_basic_004')
+ testsList.append('replication_basic_005')
+ testsList.append('replication_basic_006')
+ testsList.append('replication_basic_007')
+ testsList.append('replication_basic_008')
+ testsList.append('replication_basic_009')
+ testsList.append('replication_basic_010')
+ testsList.append('replication_basic_011')
+ testsList.append('replication_basic_012')
+ testsList.append('replication_basic_013')
+ testsList.append('replication_basic_014')
+ testsList.append('replication_basic_015')
+ testsList.append('replication_basic_016')
+ testsList.append('replication_basic_017')
+ testsList.append('replication_basic_018')
+ testsList.append('replication_basic_019')
+ testsList.append('replication_basic_020')
+ testsList.append('replication_basic_021')
+ testsList.append('replication_basic_022')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ <catch exception="'STAFException.TestSuite.SetupException'">
+ <sequence>
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
+ </message>
+ <rethrow/>
</sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
- <call function="'testCase_Postamble'"/>
+ </try>
+
+ </sequence>
+
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : 'Replication Basic' }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
</sequence>
- </testcase>
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_cleanup'">
- { 'label' : 'Replication Basic' }
- </call>
-
- <call function="'testSuite_Postamble'"/>
-
- </sequence>
-
+ </finally>
+
+ </try>
</block>
-
</sequence>
-
</function>
-
</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic_tests.xml
new file mode 100644
index 0000000..0108717
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/basic/basic_tests.xml
@@ -0,0 +1,2482 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2007-2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Add Entry
+ #@TestID Add Entry
+ #@TestPurpose Check that an entry add is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Add root suffix entry
+ #@TestPostamble
+ #@TestResult Success if trees synchronised over the topology
+ -->
+ <function name="replication_basic_001" scope="local">
+ <testcase name="getTestCaseName('Add Entry')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that an add of an entry is replicated.' % msg1 }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication_add_root_suffix.ldif' \
+ % client.getTmpDir()
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry
+ #@TestID Modify Entry
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Add entry on server
+ #@TestSteps Modify entry
+ #@TestSteps Check modify worked on server
+ #@TestPostamble
+ #@TestResult Success if modify worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_002" scope="local">
+ <testcase name="getTestCaseName('Modify Entry')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify of an entry is replicated.' % msg1 }
+ </call>
+
+
+ <!-- Modify "master" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication_add_single.ldif' \
+ % client.getTmpDir()
+ }
+ </call>
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsFilename' : '%s/replication_mod.ldif' \
+ % client.getTmpDir()
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : entryDn,
+ 'dsFilter' : '%s=%s' % (attr_type,attr_value)
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Delete Entry
+ #@TestID Delete Entry
+ #@TestPurpose Check that an entry delete is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Delete entry
+ #@TestSteps Check delete worked on server
+ #@TestPostamble
+ #@TestResult Success if delete worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_003" scope="local">
+ <testcase name="getTestCaseName('Delete Entry')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a delete of an entry is replicated.' % msg1 }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'DeleteEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : entryDn
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : entryDn,
+ 'dsFilter' : 'objectclass=*',
+ 'expectedRC' : 32
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Add Multiple Entries
+ #@TestID Add Multiple Entries
+ #@TestPurpose Check that a multiple-entry add is well
+ propagated by replication.
+ #@TestPreamble Delete root suffix entry
+ #@TestSteps Add multiple entries
+ #@TestPostamble
+ #@TestResult Success if trees synchronised over the topology
+ -->
+ <function name="replication_basic_004" scope="local">
+ <testcase name="getTestCaseName('Add Multiple Entries')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that multiple adds of an entry are replicated.' % msg1 }
+ </call>
+
+ <!-- Delete the root entry, as it is already present in
+ Example.ldif file -->
+ <call function="'DeleteEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/Example.ldif' \
+ % master.getDataDir()
+ }
+ </call>
+
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - add single
+ attribute
+ #@TestID Modify Entry - add single attribute
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Add description attribute to entry
+ #@TestSteps Check modify worked
+ #@TestPostamble
+ #@TestResult Success if modify worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_005" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - add single attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (add single attribute) is replicated.' % msg1 }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'uid=tmorris, ou=People,%s' \
+ % synchroSuffix,
+ 'attributeName' : 'description',
+ 'newAttributeValue' : ' ',
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=tmorris, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'description=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - add single
+ value
+ #@TestID Modify Entry - add single value
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Add single-valued attribute to entry
+ #@TestSteps Check modify worked
+ #@TestPostamble
+ #@TestResult Success if modify worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_006" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - add single value')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (add single value) is replicated.' % msg1 }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'uid=tmorris, ou=People,%s' \
+ % synchroSuffix,
+ 'attributeName' : 'departmentnumber',
+ 'newAttributeValue' : '5203214400',
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=tmorris, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'departmentnumber=5203214400'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 1
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - delete single
+ attribute
+ #@TestID Modify Entry - delete single attribute
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Delete attribute in entry
+ #@TestSteps Check delete worked
+ #@TestPostamble
+ #@TestResult Success if delete worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_007" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - delete single attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (delete single attribute) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_mod_delete.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ dn = 'uid=smason, ou=People,%s' % synchroSuffix
+ modif = 'delete'
+ attrType = 'roomNumber'
+ attrValue = None
+ write_replication_mod_ldif_file(filePath, dn, modif, attrType,
+ attrValue)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' \
+ % (filename,local.temp,client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=smason, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : 'roomNumber=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 0
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - delete single
+ value
+ #@TestID Modify Entry - delete single value
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Delete single attribute value in entry
+ #@TestSteps Check delete worked
+ #@TestPostamble
+ #@TestResult Success if delete worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_008" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - delete single value')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (delete single value) is replicated.' % msg1 }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'uid=jwalker, ou=People,%s' \
+ % synchroSuffix,
+ 'attributeName' : 'roomNumber',
+ 'newAttributeValue' : '3915',
+ 'changetype' : 'delete'
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=jwalker, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'roomNumber=3915'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 0
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - add multiple
+ values
+ #@TestID Modify Entry - add multiple values
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Add multiple-valued attribute to entry
+ #@TestSteps Check add worked
+ #@TestPostamble
+ #@TestResult Success if add worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_009" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - add multiple values')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (add multiple values) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ valuesToAdd = []
+ valuesToAdd.append('postaladdress:Residence Parc Europe')
+ valuesToAdd.append('postaladdress:Appartement #6')
+ valuesToAdd.append('postaladdress:31 Rue General Mangin')
+ valuesToAdd.append('postaladdress:38100 Grenoble')
+ </script>
+
+ <!-- Modify "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'listAttributes' : valuesToAdd,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <script>
+ filter1 = '(postaladdress=Residence Parc Europe)'
+ filter2 = '(postaladdress=Appartement #6)'
+ filter3 = '(postaladdress=31 Rue General Mangin)'
+ filter4 = '(postaladdress=38100 Grenoble)'
+ </script>
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : '&%s%s%s%s' \
+ % (filter1, filter2, filter3, filter4)
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 1
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - delete
+ multiple values
+ #@TestID Modify Entry - delete multiple values
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Delete multiple values in same attribute
+ #@TestSteps Check delete worked
+ #@TestPostamble
+ #@TestResult Success if delete worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_010" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - delete multiple values')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (delete multiple values) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ valuesToDelete = []
+ valuesToDelete.append('postaladdress:Appartement #6')
+ valuesToDelete.append('postaladdress:38100 Grenoble')
+ </script>
+
+ <!-- Modify "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'listAttributes' : valuesToDelete,
+ 'changetype' : 'delete'
+ }
+ </call>
+
+ <script>
+ filter1 = '(postaladdress=Appartement #6)'
+ filter2 = '(postaladdress=38100 Grenoble)'
+ </script>
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : '|%s%s' % (filter1, filter2)
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 0
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - replace
+ multiple values
+ #@TestID Modify Entry - replace multiple values
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Replace multiple values in same attribute
+ #@TestSteps Check replace worked
+ #@TestPostamble
+ #@TestResult Success if replace worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_011" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - replace multiple values')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (replace multiple values) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ valuesToReplace = []
+ valuesToReplace.append('postaladdress: Residence Letilleuil')
+ valuesToReplace.append('postaladdress: 18 rue Nicolas Chorier')
+ </script>
+
+ <!-- Modify "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'listAttributes' : valuesToReplace,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <script>
+ filter1 = '(postaladdress=Residence Letilleuil)'
+ filter2 = '(postaladdress=18 rue Nicolas Chorier)'
+ </script>
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : '&%s%s' % (filter1, filter2)
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - add single
+ value to multiple valued attribute
+ #@TestID Modify Entry - add single value to multiple
+ valued attribute
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Add single value to multiple-valued attribute
+ #@TestSteps Check value add worked
+ #@TestPostamble
+ #@TestResult Success if value add worked and trees
+ synchronised over the topology
+ -->
+ <function name="replication_basic_012" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - add single value to multiple valued attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (add single value to multiple valued attribute) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ valuesToAdd = []
+ valuesToAdd.append('postaladdress:38000 Grenoble')
+ </script>
+
+ <!-- Modify "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'listAttributes' : valuesToAdd,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'postaladdress=38000 Grenoble'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 1
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - delete single
+ value from multiple valued attribute
+ #@TestID Modify Entry - delete single value from multiple
+ valued attribute
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Delete single value from multiple-valued
+ attribute
+ #@TestSteps Check value delete worked
+ #@TestPostamble
+ #@TestResult Success if value delete worked and trees
+ synchronised over the topology
+ -->
+ <function name="replication_basic_013" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - delete single value from multiple valued attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (delete single value from multiple valued attribute) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ valuesToDelete = []
+ valuesToDelete.append('postaladdress: Residence Letilleuil')
+ </script>
+
+ <!-- Modify "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'listAttributes' : valuesToDelete,
+ 'changetype' : 'delete'
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'postaladdress=Residence Letilleuil'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 0
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - replace case
+ sensitive attribute
+ #@TestID Modify Entry - replace case sensitive attribute
+ #@TestPurpose Check that case sensitive attribute
+ modifications are replicated.
+ #@TestPreamble
+ #@TestSteps Add entry
+ #@TestSteps Replace description attribute in entry
+ #@TestSteps Check replace worked
+ #@TestPostamble
+ #@TestResult Success if replace worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_014" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - replace case sensitive attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (replace case sensitive attribute) is replicated.' % msg1 }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
+ % master.getDataDir()
+ }
+ </call>
+
+ <script>
+ value = 'Profession Tap Fitter and Plumber'
+ valuesToReplace = []
+ valuesToReplace.append('description: %s' % value)
+ </script>
+
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'uid=tfitter, ou=People,%s' \
+ % synchroSuffix,
+ 'listAttributes' : valuesToReplace,
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <script>
+ filter = 'description=%s' % value
+ </script>
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=tfitter, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : filter
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 1
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - replace
+ userpassword
+ #@TestID Modify Entry - replace userpassword
+ #@TestPurpose Check replaced userpasswords are replicated.
+ #@TestPreamble
+ #@TestSteps Add user entry on server A
+ #@TestSteps Bind as user with userpassword to server A
+ #@TestSteps Replace user's userpassword
+ #@TestSteps Bind as user with old userpassword to server B
+ #@TestSteps Bind as user with new userpassword to server B
+ #@TestPostamble
+ #@TestResult Success if bind with old userpassword fails with
+ LDAP_INVALID_CREDENTIALS error and bind with new
+ user password suceeds and trees are synchronised
+ over the topology
+ -->
+ <function name="replication_basic_015" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - replace userpassword')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (replace userpassword) is replicated.' % msg1 }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <script>
+ userDn = 'uid=pmoriarty, ou=People, %s' % synchroSuffix
+ oldPassword = 'jajejijoju'
+ newPassword = 'JUAJUAJUA'
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Professor')
+ listAttr.append('sn:Moriarty')
+ listAttr.append('cn:Professor Moriarty')
+ listAttr.append('l:London')
+ listAttr.append('userpassword:%s' % oldPassword)
+ </script>
+ <message>
+ 'replace userpassword: add user entry %s' % userDn
+ </message>
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr
+ }
+ </call>
+
+ <!-- Check userDn can bind with oldPassword on "master" server -->
+ <message>
+ 'replace userpassword: bind on master using password %s' \
+ % oldPassword
+ </message>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : userDn,
+ 'dsInstancePswd' : oldPassword,
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'objectclass=*'
+ }
+ </call>
+
+ <!-- Replace userDn's oldPassword with newPassword on "master"
+ server -->
+ <message>
+ 'replace userpassword: replace user password %s with %s' \
+ % (oldPassword, newPassword)
+ </message>
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : userDn,
+ 'attributeName' : 'userpassword',
+ 'newAttributeValue' : 'JUAJUAJUA',
+ 'changetype' : 'replace'
+ }
+ </call>
+
+ <script>
+ consumer = consumerList[0]
+ </script>
+ <!-- Try binding as userDn with oldPassword on "consumer" server:
+ ==> should fail with LDAP_INVALID_CREDENTIALS (49) error -->
+ <message>
+ 'replace userpassword: bind on consumer using old password %s :\
+ should fail with error LDAP_INVALID_CREDENTIALS (49)' \
+ % oldPassword
+ </message>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumer.getHostname(),
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : userDn,
+ 'dsInstancePswd' : oldPassword,
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'objectclass=*',
+ 'expectedRC' : 49
+ }
+ </call>
+
+ <!-- Check userDn can bind with newPassword on "consumer"
+ server -->
+ <message>
+ 'replace userpassword: bind on consumer using new password %s :\
+ should pass' % newPassword
+ </message>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumer.getHostname(),
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : userDn,
+ 'dsInstancePswd' : newPassword,
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'objectclass=*'
+ }
+ </call>
+
+ <!-- Delete added entry as clean-up measure -->
+ <message>
+ 'replace userpassword: delete user entry %s on master' \
+ % userDn
+ </message>
+ <call function="'DeleteEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : userDn
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - add binary
+ attribute
+ #@TestID Modify Entry - add binary attribute
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Add jpegPhoto attribute to entry with binary
+ value
+ #@TestSteps Check add worked
+ #@TestPostamble
+ #@TestResult Success if add worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_016" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - add binary attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (add binary attribute) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_mod_add_binary.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ binaryFilePath = '%s/replication/photo1.uu' % source.data
+ dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
+ modif = 'add'
+ attrType = 'jpegPhoto'
+ write_replication_mod_binary_ldif_file(filePath, dn, modif,
+ attrType, binaryFilePath)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' \
+ % (filename,local.temp,client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'jpegPhoto=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 1
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - replace
+ binary attribute
+ #@TestID Modify Entry - replace binary attribute
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Replace jpegPhoto (binary) attribute value
+ #@TestSteps Check replace worked
+ #@TestPostamble
+ #@TestResult Success if replace worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_017" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - replace binary attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (replace binary attribute) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_mod_replace_binary.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ binaryFilePath = '%s/replication/photo2.uu' % source.data
+ dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
+ modif = 'replace'
+ attrType = 'jpegPhoto'
+ write_replication_mod_binary_ldif_file(filePath, dn, modif,
+ attrType, binaryFilePath)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' \
+ % (filename,local.temp,client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'jpegPhoto=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 1
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Modify Entry - delete binary
+ attribute
+ #@TestID Modify Entry - delete binary attribute
+ #@TestPurpose Check that an entry modify is well propagated by
+ replication.
+ #@TestPreamble
+ #@TestSteps Delete binary attribute jpegPhoto
+ #@TestSteps Check delete worked
+ #@TestPostamble
+ #@TestResult Success if delete worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_018" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - delete binary attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a modify (delete binary attribute) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_mod_delete_binary.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
+ modif = 'delete'
+ attrType = 'jpegPhoto'
+ attrValue = None
+ write_replication_mod_ldif_file(filePath, dn, modif, attrType,
+ attrValue)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' \
+ % (filename,local.temp,client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'jpegPhoto=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 0
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Rename Entry
+ #@TestID Rename Entry
+ #@TestPurpose Check that a rename (modrdn) operation is well
+ propagated by replication.
+ #@TestPreamble
+ #@TestSteps Rename entry
+ #@TestSteps Check old dn entry no longer exists
+ #@TestSteps Check new dn entry exists
+ #@TestPostamble
+ #@TestResult Success if rename worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_019" scope="local">
+ <testcase name="getTestCaseName('Rename Entry')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a rename (modrdn) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_modrdn.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix
+ newrdn = 'uid=kvaughan2'
+ newsuperior = None
+ deleteoldrdn = 1
+ write_replication_moddn_ldif_file(filePath, dn, newrdn,
+ newsuperior, deleteoldrdn)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' \
+ % (filename,local.temp,client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}" does
+ NOT exist anymore -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=kvaughan, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'objectclass=*',
+ 'expectedRC' : 32
+ }
+ </call>
+
+ <!-- check that new entry
+ "uid=kvaughan2, ou=People, ${DIRECTORY_BASE}" exists -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=kvaughan2, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'objectclass=*'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Rename Entry (keep old rdn)
+ #@TestID Rename Entry (keep old rdn)
+ #@TestPurpose Check that a rename (modrdn) operation is well
+ propagated by replication.
+ #@TestPreamble
+ #@TestSteps Rename entry
+ #@TestSteps Check old dn entry no longer exists
+ #@TestSteps Check new dn entry exists and contains old rdn
+ #@TestPostamble
+ #@TestResult Success if rename worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_020" scope="local">
+ <testcase name="getTestCaseName('Rename Entry - keep old rdn')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a rename (keep old rdn) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_modrdn_preserve.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ dn = 'uid=jwallace, ou=People,%s' % synchroSuffix
+ newrdn = 'uid=igueye'
+ newsuperior = None
+ deleteoldrdn = 0
+ write_replication_moddn_ldif_file(filePath, dn, newrdn,
+ newsuperior, deleteoldrdn)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' \
+ % (filename,local.temp,client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}" does
+ NOT exist anymore -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'objectclass=*',
+ 'expectedRC' : 32
+ }
+ </call>
+
+ <!-- check that new entry
+ "uid=igueye, ou=People, ${DIRECTORY_BASE}" exists -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=igueye, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : 'uid=jwallace'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength,
+ 'result' : searchResult,
+ 'expected' : 1
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Rename Subtree
+ #@TestID Rename Subtree
+ #@TestPurpose Check that a subtree rename (moddn) operation is
+ well propagated by replication.
+ #@TestPreamble
+ #@TestSteps Rename subtree
+ #@TestSteps Check old subtree no longer exists
+ #@TestSteps Check new subree exists
+ #@TestPostamble
+ #@TestResult Success if rename worked and trees synchronised
+ over the topology
+ -->
+ <function name="replication_basic_021" scope="local">
+ <testcase name="getTestCaseName('Rename Subtree')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a subtree rename (moddn) is replicated.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_moddn.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ dn = 'ou=People,%s' % synchroSuffix
+ newrdn = 'ou=Special People'
+ newsuperior = 'ou=Special Users,%s' % synchroSuffix
+ deleteoldrdn = 0
+ write_replication_moddn_ldif_file(filePath, dn, newrdn,
+ newsuperior, deleteoldrdn)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' \
+ % (filename,local.temp,client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}" does
+ NOT exist anymore -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : 'uid=gfarmer, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'objectclass=*',
+ 'expectedRC' : 32
+ }
+ </call>
+
+ <script>
+ base = 'uid=gfarmer, ou=Special People, ou=Special Users,%s' \
+ % synchroSuffix
+ </script>
+ <!-- check that new entry
+ "uid=gfarmer, ou=Special People, ou=Special Users,
+ ${DIRECTORY_BASE}" exists -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsBaseDN' : base,
+ 'dsFilter' : 'objectclass=*'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Basic Tests
+ #@TestName Replication: Basic: Add entry after restart
+ #@TestID Add entry after restart
+ #@TestPurpose Check entry add over secured replication after
+ server restart
+ #@TestPreamble
+ #@TestSteps Restart servers
+ #@TestSteps Add entry
+ #@TestPostamble
+ #@TestResult Success if trees synchronised over the topology
+ -->
+ <function name="replication_basic_022" scope="local">
+ <testcase name="getTestCaseName('Add entry after restart')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check entry add over secured replication after server restart.' % msg1 }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <call function="'stopServers'">
+ [_splitServerList]
+ </call>
+
+ <!-- Start the servers in the topology -->
+ <call function="'startServers'">
+ [_splitServerList]
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ userDn = 'uid=RESTART-iabizen-%s, %s' % \
+ (i,synchroSuffix)
+ </script>
+
+ <!-- Add entry to one of the other servers -->
+ <script>
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen-%s' % i)
+ listAttr.append('sn:Abizen-%s' % i)
+ listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
+ listAttr.append('l:ICNC')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr
+ }
+ </call>
+
+ </sequence>
+ </iterate>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify synchronization of servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy.xml
index 4caa6a1..cf54328 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy.xml
@@ -7,412 +7,139 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2007-2010 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
<defaultcall function="replication_binarycopy"/>
- <function name="replication_binarycopy">
+ <function name="replication_binarycopy" scope="local">
<sequence>
- <block name="'binarycopy'">
- <sequence>
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
- <call function="'testSuite_Preamble'"/>
- <!--- Test Suite information
- #@TestSuiteName Replication Binary Copy Tests
- #@TestSuitePurpose Verify that the servers in a replicated topology
- can be initialised by the means of a binary copy
- (backup-restore).
- #@TestSuiteID Binary Copy Tests
- #@TestSuiteGroup Binary Copy
- #@TestGroup Replication
- #@TestScript replication_binarycopy.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'" >
- { 'label' : 'Replication Binarycopy' }
- </call>
-
-
- <!--- Test Case information
- #@TestMarker Replication Binary Copy Tests
- #@TestName Replication: Binary Copy: Off-line
- initialisation
- #@TestID Off-line initialisation
- #@TestPurpose Initialise replicated servers using off-line
- backup/restore
- #@TestPreamble
- #@TestSteps Call dsreplication pre-external-initialization
- #@TestSteps Stop servers
- #@TestSteps Import data on server A
- #@TestSteps Back-up server A
- #@TestSteps Restore back-up on other servers
- #@TestSteps Start servers
- #@TestSteps Call dsreplication post-external-initialization
- #@TestSteps Add entry on server A
- #@TestPostamble
- #@TestResult Success if trees synchronized
- -->
- <testcase name="getTestCaseName('Off-line initialisation')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <script>
- m = md5_hash()
- m.update(STAXCurrentTestcase)
- </script>
- <message>
- 'Replication: Binary Copy: Off-line initialisation. \
- Initialise replicated servers using off-line backup/restore'
- </message>
-
-
- <!-- Pre-initialise the servers in the topology -->
- <message>
- '+++++ binary copy off-line: prepare servers for external \
- initialization'
- </message>
- <call function="'preInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'localOnly' : False,
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Stop the servers in the topology -->
- <call function="'stopServers'">
- [_topologyServerList]
- </call>
+ <block name="'replication_binarycopy'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'binarycopy'
- <!-- Import data into "master" server -->
- <message>
- '+++++ binary copy off-line: import data on %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'ImportLdifWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'backEnd' : DIRECTORY_INSTANCE_BE,
- 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir
- }
- </call>
-
- <!-- Backup "master" server -->
- <message>
- '+++++ binary copy off-line: back-up server %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'backup'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest())
- }
- </call>
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication BinaryCopy'
+ </script>
- <!-- Copy backup to "consumer" servers and restore it -->
- <paralleliterate var="consumer" in="consumerList">
- <sequence>
- <script>
- consumerBackupDir = '%s' % consumer.getTmpDir()
- </script>
- <call function="'CopyFolderByExtension'">
- { 'location' : masterHost,
- 'remotehost' : consumer.getHostname(),
- 'srcfolder' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest()),
- 'destfolder' : '%s/replication/master_backup_%s' \
- % (consumerBackupDir,m.hexdigest()),
- 'extension' : '*'
- }
- </call>
-
- <message>
- '+++++ binary copy off-line: restore back-up on %s:%s' \
- % (consumer.getHostname(), consumer.getPort())
- </message>
- <call function="'restore'">
- { 'location' : consumer.getHostname(),
- 'dsPath' : '%s/%s' % (consumer.getDir(), OPENDSNAME),
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (consumerBackupDir,m.hexdigest())
- }
- </call>
- </sequence>
- </paralleliterate>
-
- <!-- Start the servers in the topology -->
- <call function="'startServers'">
- [_topologyServerList]
- </call>
-
- <!-- Check some data was imported into "master" server -->
- <call function="'checkImport'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsHost' : masterHost,
- 'dsPort' : master.getPort(),
- 'dsAdminPort' : master.getAdminPort(),
- 'dsDn' : master.getRootDn(),
- 'dsPswd' : master.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=rhunt, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
-
- <!-- Post-initialise the servers in the topology -->
- <message>
- '+++++ binary copy off-line: end external server initialization'
- </message>
- <call function="'postInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Add entry to "master" server -->
- <message>
- '+++++ binary copy off-line: add entry to %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
- % clientDataDir
- }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
- <!--- Test Case information
- #@TestMarker Replication Binary Copy Tests
- #@TestName Replication: Binary Copy: On-line initialisation
- #@TestID On-line initialisation
- #@TestPurpose Initialise replicated servers using on-line
- backup/restore
- #@TestPreamble
- #@TestSteps Call dsreplication pre-external-initialization
- #@TestSteps Import data on server A
- #@TestSteps Back-up server A
- #@TestSteps Restore back-up on other servers
- #@TestSteps Call dsreplication post-external-initialization
- #@TestSteps Add entry on server A
- #@TestPostamble
- #@TestResult Success if trees synchronized
- -->
- <testcase name="getTestCaseName('On-line initialisation')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <script>
- m = md5_hash()
- m.update(STAXCurrentTestcase)
- </script>
- <message>
- 'Replication: Binary Copy: On-line initialisation. Initialise \
- replicated servers using on-line backup/restore'
- </message>
-
- <!-- Pre-initialise the servers in the topology -->
- <message>
- '+++++ binary copy on-line: prepare servers for external \
- initialization'
- </message>
- <call function="'preInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'localOnly' : False,
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Import data into "master" server -->
- <message>
- '+++++ binary copy on-line: import data on %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'ImportLdifWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'ldifFile' : '%s/replication/Example.ldif' \
- % masterDataDir
- }
- </call>
-
- <!-- Check some data was imported into "master" server -->
- <call function="'checkImport'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsHost' : masterHost,
- 'dsPort' : master.getPort(),
- 'dsAdminPort' : master.getAdminPort(),
- 'dsDn' : master.getRootDn(),
- 'dsPswd' : master.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=rhunt, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
-
- <!-- Backup "master" server -->
- <message>
- '+++++ binary copy on-line: back-up server %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'backupTask'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'taskID' : 'backup task',
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest())
- }
- </call>
-
- <!-- Copy backup to "consumer" servers and restore it -->
- <paralleliterate var="consumer" in="consumerList">
- <sequence>
- <script>
- consumerBackupDir = '%s' % consumer.getTmpDir()
- </script>
-
- <call function="'CopyFolderByExtension'">
- { 'location' : masterHost,
- 'remotehost' : consumer.getHostname(),
- 'srcfolder' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest()),
- 'destfolder' : '%s/replication/master_backup_%s' \
- % (consumerBackupDir,m.hexdigest()),
- 'extension' : '*'
- }
- </call>
+ <!--- Test Suite information
+ #@TestSuiteName Replication BinaryCopy Tests
+ #@TestSuitePurpose Verify that the total-update operations are replicated
+ correctly between two servers.
+ #@TestSuiteID BinaryCopy Tests
+ #@TestSuiteGroup BinaryCopy
+ #@TestGroup Replication
+ #@TestScript replication_binarycopy.xml
+ #@TestHTMLLink http://www.forgerock.org/
+ -->
- <message>
- '+++++ binary copy on-line: restore back-up on %s:%s' \
- % (consumer.getHostname(), consumer.getPort())
+ <call function="'testSuite_Preamble'"/>
+
+ <try>
+ <sequence>
+
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'" >
+ { 'label' : _label }
+ </call>
+
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('binarycopy/binarycopy_tests')
+ </script>
+
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
+
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: BinaryCopy:'
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_binarycopy_001')
+ testsList.append('replication_binarycopy_002')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ <catch exception="'STAFException.TestSuite.SetupException'">
+ <sequence>
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
</message>
- <call function="'restoreTask'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumer.getHostname(),
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'taskID' : 'restore task',
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (consumerBackupDir,m.hexdigest())
- }
- </call>
+ <rethrow/>
</sequence>
- </paralleliterate>
-
- <!-- Post-initialise the servers in the topology -->
- <message>
- '+++++ binary copy on-line: end external server initialization'
- </message>
- <call function="'postInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Add entry to "master" server -->
- <message>
- '+++++ binary copy on-line: add entry to %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
- % clientDataDir
- }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
+
+ </try>
+
+ </sequence>
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication Binarycopy' }
- </call>
- <call function="'testSuite_Postamble'"/>
- </sequence>
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </finally>
+
+ </try>
</block>
</sequence>
</function>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy_tests.xml
new file mode 100644
index 0000000..9d1bb28
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/binarycopy/binarycopy_tests.xml
@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2007-2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!--- Test Case information
+ #@TestMarker Replication Binary Copy Tests
+ #@TestName Replication: Binary Copy: Off-line
+ initialisation
+ #@TestID Off-line initialisation
+ #@TestPurpose Initialise replicated servers using off-line
+ backup/restore
+ #@TestPreamble
+ #@TestSteps Call dsreplication pre-external-initialization
+ #@TestSteps Stop servers
+ #@TestSteps Import data on server A
+ #@TestSteps Back-up server A
+ #@TestSteps Restore back-up on other servers
+ #@TestSteps Start servers
+ #@TestSteps Call dsreplication post-external-initialization
+ #@TestSteps Add entry on server A
+ #@TestPostamble
+ #@TestResult Success if trees synchronized
+ -->
+ <function name="replication_binarycopy_001" scope="local">
+ <testcase name="getTestCaseName('Off-line initialisation')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <script>
+ m = md5_hash()
+ m.update(STAXCurrentTestcase)
+ </script>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialise replicated servers using off-line backup/restore.' % msg1 }
+ </call>
+
+ <!-- Pre-initialise the servers in the topology -->
+ <message>
+ '+++++ binary copy off-line: prepare servers for external \
+ initialization'
+ </message>
+ <call function="'preInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'localOnly' : False,
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <call function="'stopServers'">
+ [_topologyServerList]
+ </call>
+
+ <!-- Import data into "master" server -->
+ <message>
+ '+++++ binary copy off-line: import data on %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'ImportLdifWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'backEnd' : DIRECTORY_INSTANCE_BE,
+ 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir
+ }
+ </call>
+
+ <!-- Backup "master" server -->
+ <message>
+ '+++++ binary copy off-line: back-up server %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'backup'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest())
+ }
+ </call>
+
+ <!-- Copy backup to "consumer" servers and restore it -->
+ <paralleliterate var="consumer" in="consumerList">
+ <sequence>
+ <script>
+ consumerBackupDir = '%s' % consumer.getTmpDir()
+ </script>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : masterHost,
+ 'remotehost' : consumer.getHostname(),
+ 'srcfolder' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest()),
+ 'destfolder' : '%s/replication/master_backup_%s' \
+ % (consumerBackupDir,m.hexdigest()),
+ 'extension' : '*'
+ }
+ </call>
+
+ <message>
+ '+++++ binary copy off-line: restore back-up on %s:%s' \
+ % (consumer.getHostname(), consumer.getPort())
+ </message>
+ <call function="'restore'">
+ { 'location' : consumer.getHostname(),
+ 'dsPath' : '%s/%s' % (consumer.getDir(), OPENDSNAME),
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (consumerBackupDir,m.hexdigest())
+ }
+ </call>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Start the servers in the topology -->
+ <call function="'startServers'">
+ [_topologyServerList]
+ </call>
+
+ <!-- Check some data was imported into "master" server -->
+ <call function="'checkImport'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsHost' : masterHost,
+ 'dsPort' : master.getPort(),
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsDn' : master.getRootDn(),
+ 'dsPswd' : master.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=rhunt, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+
+ <!-- Post-initialise the servers in the topology -->
+ <message>
+ '+++++ binary copy off-line: end external server initialization'
+ </message>
+ <call function="'postInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <message>
+ '+++++ binary copy off-line: add entry to %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
+ % clientDataDir
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication Binary Copy Tests
+ #@TestName Replication: Binary Copy: On-line initialisation
+ #@TestID On-line initialisation
+ #@TestPurpose Initialise replicated servers using on-line
+ backup/restore
+ #@TestPreamble
+ #@TestSteps Call dsreplication pre-external-initialization
+ #@TestSteps Import data on server A
+ #@TestSteps Back-up server A
+ #@TestSteps Restore back-up on other servers
+ #@TestSteps Call dsreplication post-external-initialization
+ #@TestSteps Add entry on server A
+ #@TestPostamble
+ #@TestResult Success if trees synchronized
+ -->
+ <function name="replication_binarycopy_002" scope="local">
+ <testcase name="getTestCaseName('On-line initialisation')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <script>
+ m = md5_hash()
+ m.update(STAXCurrentTestcase)
+ </script>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialise replicated servers using on-line backup/restore.' % msg1 }
+ </call>
+
+ <!-- Pre-initialise the servers in the topology -->
+ <message>
+ '+++++ binary copy on-line: prepare servers for external \
+ initialization'
+ </message>
+ <call function="'preInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'localOnly' : False,
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Import data into "master" server -->
+ <message>
+ '+++++ binary copy on-line: import data on %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'ImportLdifWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'ldifFile' : '%s/replication/Example.ldif' \
+ % masterDataDir
+ }
+ </call>
+
+ <!-- Check some data was imported into "master" server -->
+ <call function="'checkImport'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsHost' : masterHost,
+ 'dsPort' : master.getPort(),
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsDn' : master.getRootDn(),
+ 'dsPswd' : master.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=rhunt, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+
+ <!-- Backup "master" server -->
+ <message>
+ '+++++ binary copy on-line: back-up server %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'backupTask'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'taskID' : 'backup task',
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest())
+ }
+ </call>
+
+ <!-- Copy backup to "consumer" servers and restore it -->
+ <paralleliterate var="consumer" in="consumerList">
+ <sequence>
+ <script>
+ consumerBackupDir = '%s' % consumer.getTmpDir()
+ </script>
+
+ <call function="'CopyFolderByExtension'">
+ { 'location' : masterHost,
+ 'remotehost' : consumer.getHostname(),
+ 'srcfolder' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest()),
+ 'destfolder' : '%s/replication/master_backup_%s' \
+ % (consumerBackupDir,m.hexdigest()),
+ 'extension' : '*'
+ }
+ </call>
+
+ <message>
+ '+++++ binary copy on-line: restore back-up on %s:%s' \
+ % (consumer.getHostname(), consumer.getPort())
+ </message>
+ <call function="'restoreTask'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumer.getHostname(),
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'taskID' : 'restore task',
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (consumerBackupDir,m.hexdigest())
+ }
+ </call>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Post-initialise the servers in the topology -->
+ <message>
+ '+++++ binary copy on-line: end external server initialization'
+ </message>
+ <call function="'postInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <message>
+ '+++++ binary copy on-line: add entry to %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
+ % clientDataDir
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml
index a3ef9c5..a718d9e 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml
@@ -7,1454 +7,144 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2008-2009 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
-
<defaultcall function="replication_changelog"/>
-
- <function name="replication_changelog">
+ <function name="replication_changelog" scope="local">
<sequence>
- <block name="'changelog'">
- <sequence>
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication Changelog Tests
- #@TestSuitePurpose Test the accessibility of the changelog through
- search, export, backup and restore operations.
- Also, test other replication features using
- changelog properties.
- #@TestSuiteID Changelog Tests
- #@TestSuiteGroup Changelog
- #@TestGroup Replication
- #@TestScript replication_changelog.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'">
- { 'dataFile' : 'Example.ldif',
- 'label' : 'Replication Changelog' }
- </call>
+ <block name="'replication_changelog'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'changelog'
+
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication Changelog'
+ </script>
+ <!--- Test Suite information
+ #@TestSuiteName Replication Changelog Tests
+ #@TestSuitePurpose Verify that the changelog operations are replicated
+ correctly between two servers.
+ #@TestSuiteID Changelog Tests
+ #@TestSuiteGroup Changelog
+ #@TestGroup Replication
+ #@TestScript replication_changelog.xml
+ #@TestHTMLLink http://www.forgerock.org/
+ -->
+
+ <call function="'testSuite_Preamble'"/>
-
- <!--- Test Case information
- #@TestMarker Replication Changelog Tests
- #@TestName Replication: Changelog: Search
- #@TestID Search
- #@TestPurpose Check replication changelog can be searched and
- look up changes
- #@TestPreamble
- #@TestSteps Add entry to server A
- #@TestSteps Modify entry on server A
- #@TestSteps Search changelogs and check for made changes
- #@TestPostamble
- #@TestResult Success if the corresponding changes can be
- found in the changelog
- -->
- <testcase name="getTestCaseName('Search')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Changelog: Search. \
- Check replication changelog can be searched and look up changes'
- </message>
+ <try>
+ <sequence>
- <!-- Add entry to "master" server -->
- <script>
- userDn = 'uid=iabizen.0, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen.0')
- listAttr.append('sn:Abizen.0')
- listAttr.append('cn:Izen Abizen.0')
- listAttr.append('l:ICNC')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'">
+ { 'dataFile' : 'Example.ldif',
+ 'label' : _label }
+ </call>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : userDn,
- 'attributeName' : 'l',
- 'newAttributeValue' : 'GEC',
- 'changetype' : 'replace',
- 'expectedRC' : 0
- }
- </call>
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('changelog/changelog_tests')
+ </script>
- <!-- Let some time for the change to propagate -->
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 2000 }
- </call>
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
+
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: Changelog:'
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_changelog_001')
+ testsList.append('replication_changelog_002')
+ testsList.append('replication_changelog_003')
+ testsList.append('replication_changelog_004')
+ #OOS: testsList.append('replication_changelog_005')
+ testsList.append('replication_changelog_006')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
- <!-- Search changelog in the various replication servers -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
+ </sequence>
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
- <!-- Search for entry add -->
- <call function="'ldapSearchWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=iabizen.0',
- 'dsAttributes' : 'dn'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <!-- expect entry returned => len(searchResult) > 0
- =====> resultLength = 1 -->
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
- <!-- Search for entry modify -->
- <call function="'ldapSearchWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'l=GEC',
- 'dsAttributes' : 'dn'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <!-- expect entry returned => len(searchResult) > 0
- =====> resultLength = 1 -->
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
- </sequence>
- </paralleliterate>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Changelog Tests
- #@TestName Replication: Changelog: Export (on-line)
- #@TestID Export (on-line)
- #@TestPurpose Check replication changelog can be exported
- on-line and look up changes
- #@TestPreamble
- #@TestSteps Add entry to server A
- #@TestSteps Export every changelog to ldif file
- #@TestSteps Check for added entry in each exported changelog
- file
- #@TestPostamble
- #@TestResult Success if the corresponding change can be found
- in the exported changelog files
- -->
- <testcase name="getTestCaseName('Export (on-line)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Changelog: Export (on-line). \
- Check replication changelog can be exported on-line and look \
- up changes'
- </message>
-
- <!-- Add entry to "master" server -->
- <script>
- userDn = 'uid=iabizen.2, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen.2')
- listAttr.append('sn:Abizen.2')
- listAttr.append('cn:Izen Abizen.2')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Let some time for the change to propagate -->
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 2000 }
- </call>
-
- <!-- Export changelog in the various replication servers, then
- check for added entry in the exported files -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
+ <catch exception="'STAFException.TestSuite.SetupException'">
<sequence>
-
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
+ </message>
+ <rethrow/>
+ </sequence>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </try>
- replServerBackupDir = '%s' % replServer.getTmpDir()
-
- </script>
-
- <!-- Export changelog data from server -->
- <call function="'exportLdifWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstanceAdminPort' : replServer.getAdminPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'ldifFile' : '%s/replication/changelog_export_online.ldif' \
- % replServerBackupDir,
- 'backEnd' : 'replicationChanges'
- }
- </call>
-
- <!-- Check for the added entry inside the exported file -->
- <call function="'grep'">
- {
- 'location' : replServer.getHostname(),
- 'filename' : '%s/replication/changelog_export_online.ldif' \
- % replServerBackupDir,
- 'testString' : 'uid=iabizen.2'
- }
- </call>
-
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
+ </sequence>
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </finally>
-
- <!--- Test Case information
- #@TestMarker Replication Changelog Tests
- #@TestName Replication: Changelog:
- Backup-restore (off-line)
- #@TestID Backup-restore (off-line)
- #@TestPurpose Check replication changelog can be backuped and
- restored off-line
- #@TestPreamble Backup server suffix
- #@TestSteps Add entry A to server
- #@TestSteps Stop servers
- #@TestSteps Backup every changelog
- #@TestSteps Start servers
- #@TestSteps Add entry B to server
- #@TestSteps Stop servers
- #@TestSteps Restore server suffix (without entries A and B)
- #@TestSteps Restore every changelog
- #@TestSteps Start servers
- #@TestSteps Check for added entry A in changelog and server
- #@TestSteps Check for added entry B in changelog and server
- #@TestPostamble
- #@TestResult Success if the search for entry A succeeds and
- the search for entry B fails
- -->
- <testcase name="getTestCaseName('Backup-restore (off-line)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Changelog: Backup-restore (off-line). \
- Check replication changelog can be backed up and restored \
- off-line'
- </message>
-
- <!-- Backup "master" server -->
- <message>
- '+++++ binary copy off-line: back-up server %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'backup'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'backupDir' : '%s/replication/master_backup' % masterBackupDir
- }
- </call>
-
- <!-- Add entry A to "master" server -->
- <script>
- userDnA = 'uid=iabizen.A, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen.A')
- listAttr.append('sn:Abizen.A')
- listAttr.append('cn:Izen Abizen.A')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDnA,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Let some time for the change to propagate -->
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 2000 }
- </call>
-
- <!-- Stop the servers in the topology -->
- <script>
- if globalSplitServers:
- serverList = _topologyReplServerList
- else:
- serverList = _topologyServerList
- </script>
- <call function="'stopServers'">
- [serverList]
- </call>
-
- <!-- Backup changelog in the various replication servers -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- replServerDataDir = '%s' % replServer.getDataDir()
- replServerBackupDir = '%s' % replServer.getTmpDir()
- </script>
-
- <call function="'backup'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'backupDir' : '%s/replication/changelog_backup' \
- % replServerBackupDir,
- 'backEnd' : 'replicationChanges'
- }
- </call>
- </sequence>
- </paralleliterate>
-
- <!-- Start the servers in the topology -->
- <script>
- if globalSplitServers:
- serverList = _topologyReplServerList
- else:
- serverList = _topologyServerList
- </script>
- <call function="'startServers'">
- [serverList]
- </call>
-
- <!-- Add entry B to "master" server -->
- <script>
- userDnB = 'uid=iabizen.B, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen.B')
- listAttr.append('sn:Abizen.B')
- listAttr.append('cn:Izen Abizen.B')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDnB,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Let some time for the change to propagate -->
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 2000 }
- </call>
-
- <!-- Stop the servers in the topology -->
- <call function="'stopServers'">
- [_splitServerList]
- </call>
-
-
- <!-- Restore master_backup in every server, then restore
- changelog_backup in the various replication servers -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
-
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
-
- serverBackupDir = '%s' % server.getTmpDir()
- replServerDataDir = '%s' % replServer.getDataDir()
- replServerBackupDir = '%s' % replServer.getTmpDir()
- </script>
-
- <!-- Restore master_backup -->
- <if expr="i != 0">
- <!-- _topologyServerList[0] corresponds to "master", so
- no need to copy the files for that case -->
- <sequence>
- <!-- TODO: check what schematokens.dat files are? -->
- <if expr="os.path.exists
- ('%s/config/schematokens.dat' % dsPath)" >
- <call function="'copyFile'">
- { 'location' : masterHost,
- 'remotehost' : server.getHostname(),
- 'srcfile' : '%s/config/schematokens.dat' \
- % masterPath,
- 'destfile' : '%s/config/schematokens.dat' \
- % serverPath
- }
- </call>
- </if>
- <call function="'CopyFolderByExtension'">
- { 'location' : masterHost,
- 'remotehost' : server.getHostname(),
- 'srcfolder' : masterBackupDir,
- 'destfolder' : '%s/replication/master_backup' \
- % serverBackupDir,
- 'extension' : '*'
- }
- </call>
- </sequence>
- </if>
- <call function="'restore'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'backupDir' : '%s/replication/master_backup' \
- % serverBackupDir
- }
- </call>
-
- <!-- Restore changelog_backup -->
- <call function="'restore'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'backupDir' : '%s/replication/changelog_backup' \
- % replServerBackupDir
- }
- </call>
- </sequence>
- </paralleliterate>
-
- <!-- Start the servers in the topology -->
- <call function="'startServers'">
- [_splitServerList]
- </call>
-
-
-
- <!-- Search synchroSuffix and changelog in the various servers,
- looking for entries A (should be there) and B (shouldn't be) -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
- <!-- Search for entry A (should be there) -->
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : userDnA,
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 0
- }
- </call>
- <call function="'ldapSearchWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=iabizen.A',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 0
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <!-- expect entry returned => len(searchResult) > 0
- =====> resultLength = 1 -->
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
- <!-- Search for entry B (should NOT be there) -->
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : userDnB,
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 32
- }
- </call>
- <call function="'ldapSearchWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=iabizen.B',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 0
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <!-- expect NO entry returned => len(searchResult) = 0
- =====> resultLength = 0 -->
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 0
- }
- </call>
-
- </sequence>
- </paralleliterate>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-<if expr="0">
- <!-- Due to the impossibility to ensure all the restore operations (of both
- db and changelogs) are done at the very same time, there's no controlling
- the output of this testcase.
- -->
- <!--- Test Case information
- #@TestMarker Replication Changelog Tests
- #@TestName Replication: Changelog: Backup-restore (on-line)
- #@TestID Backup-restore (on-line)
- #@TestPurpose Check replication changelog can be backuped and
- restored on-line
- #@TestPreamble Backup server suffix (done at the beginning of
- the test suite)
- #@TestSteps Add entry AA to server
- #@TestSteps Backup every changelog
- #@TestSteps Add entry BB to server
- #@TestSteps Restore every changelog
- #@TestSteps Restore server suffix (without entries AA and BB)
- #@TestSteps Check for added entry AA in changelog and server
- #@TestSteps Check for added entry BB in changelog and server
- #@TestPostamble
- #@TestResult Success if the search for entry AA succeeds and
- the search for entry BB fails
- -->
- <testcase name="getTestCaseName('Backup-restore (on-line)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Changelog: Backup-restore (on-line). \
- Check replication changelog can be backuped and restored \
- on-line'
- </message>
-
- <!-- Add entry AA to "master" server -->
- <script>
- userDnAA = 'uid=iabizen.AA, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen.AA')
- listAttr.append('sn:Abizen.AA')
- listAttr.append('cn:Izen Abizen.AA')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDnAA,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Let some time for the change to propagate -->
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 2000 }
- </call>
-
- <!-- Backup changelog in the various replication servers -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
-
- replServerBackupDir = '%s' % replServer.getTmpDir()
- </script>
-
- <call function="'backupTask'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'taskID' : 'changelog backup task',
- 'backupDir' : '%s/replication/changelog_backup_online' \
- % replServerBackupDir,
- 'backEnd' : 'replicationChanges'
- }
- </call>
- </sequence>
- </paralleliterate>
-
-
- <!-- Add entry BB to "master" server -->
- <script>
- userDnBB = 'uid=iabizen.BB, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen.BB')
- listAttr.append('sn:Abizen.BB')
- listAttr.append('cn:Izen Abizen.BB')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDnBB,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Let some time for the change to propagate -->
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 2000 }
- </call>
-
- <!-- Restore changelog_backup_online in the various replication
- servers, then restore master_backup in every server -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
-
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
-
- serverBackupDir = '%s' % server.getTmpDir()
- replServerBackupDir = '%s' % replServer.getTmpDir()
-
- </script>
-
- <!-- Restore changelog_backup -->
- <call function="'restoreTask'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'taskID' : 'changelog restore task',
- 'backupDir' : '%s/replication/changelog_backup_online' \
- % replServerBackupDir
- }
- </call>
-
- <!-- Restore master_backup -->
- <if expr="i != 0">
- <!-- _topologyServerList[0] corresponds to "master", so
- no need to copy the files for that case -->
- <sequence>
- <if expr="os.path.exists
- ('%s/config/schematokens.dat' % dsPath)" >
- <call function="'copyFile'">
- { 'location' : masterHost,
- 'remotehost' : server.getHostname(),
- 'srcfile' : '%s/config/schematokens.dat' \
- % masterPath,
- 'destfile' : '%s/config/schematokens.dat' \
- % serverPath
- }
- </call>
- </if>
- <call function="'CopyFolderByExtension'">
- { 'location' : masterHost,
- 'remotehost' : server.getHostname(),
- 'srcfolder' : masterBackupDir,
- 'destfolder' : '%s/replication/master_backup' \
- % serverBackupDir,
- 'extension' : '*'
- }
- </call>
- </sequence>
- </if>
- <call function="'restoreTask'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'taskID' : 'restore task',
- 'backupDir' : '%s/replication/master_backup' \
- % serverBackupDir
- }
- </call>
-
- </sequence>
- </paralleliterate>
-
-
- <!-- Search synchroSuffix and changelog in the various servers,
- looking for entries AA (should be there) and BB (shouldn't be)
- -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
-
- <!-- Search for entry AA (should be there) -->
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : userDnAA,
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 0
- }
- </call>
- <call function="'ldapSearchWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=iabizen.AA',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 0
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <!-- expect entry returned => len(searchResult) > 0
- =====> resultLength = 1 -->
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
- <!-- Search for entry BB (should NOT be there) -->
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : userDnBB,
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 32
- }
- </call>
- <call function="'ldapSearchWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=iabizen.BB',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 0
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <!-- expect NO entry returned => len(searchResult) = 0
- =====> resultLength = 0 -->
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 0
- }
- </call>
-
- </sequence>
- </paralleliterate>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-</if>
-
- <!--- Test Case information
- #@TestMarker Replication Changelog Tests
- #@TestName Replication: Changelog: Changelog Reset
- #@TestID Changelog Reset
- #@TestPurpose Check replication changelog is reset by
- dsreplication pre/post-external-initialize
- #@TestPreamble
- #@TestSteps Add entry to server A
- #@TestSteps Search changelogs and check for made change
- #@TestSteps Reset changelog (call pre/post-external init)
- #@TestSteps Search changelogs and check for made change
- #@TestPostamble
- #@TestResult Success if the corresponding change can be found
- in the changelog prior to the reset but not any
- more after the reset
- -->
- <testcase name="getTestCaseName('Changelog Reset')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Changelog: Changelog Reset. \
- Check replication changelog is reset by \
- dsreplication pre/post-external-initialize'
- </message>
-
- <!-- Add entry to "master" server -->
- <script>
- userDn = 'uid=iabizen.3, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen.3')
- listAttr.append('sn:Abizen.3')
- listAttr.append('cn:Izen Abizen.3')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Let some time for the change to propagate -->
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 2000 }
- </call>
-
- <!-- Search changelog in the various replication servers -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
-
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
-
- <call function="'ldapSearchWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges' ,
- 'dsFilter' : 'uid=iabizen.3',
- 'dsAttributes' : 'dn'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <!-- expect entry returned => len(searchResult) > 0
- =====> resultLength = 1 -->
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
- </sequence>
- </paralleliterate>
-
-
- <!-- Reset the changelog (call pre/post-external-init) -->
- <call function="'resetReplicationData'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'sourceInstanceHost' : masterHost,
- 'sourceInstancePort' : master.getPort(),
- 'sourceInstanceAdminPort' : master.getAdminPort(),
- 'sourceInstanceDn' : master.getRootDn(),
- 'sourceInstancePswd' : master.getRootPwd(),
- 'backupDir' : masterBackupDir,
- 'suffixDn' : synchroSuffix
- }
- </call>
-
- <!-- Search changelog in the various replication servers -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
- <!-- Search for entry in the suffix (should NOT be there) -->
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : userDn,
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 32
- }
- </call>
- <!-- Search for corresponding change in the changelog
- (should NOT be there) -->
- <call function="'ldapSearchWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=iabizen.3',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 0
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <!-- expect NO entry returned => len(searchResult) = 0
- =====> resultLength = 0 -->
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 0
- }
- </call>
-
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Changelog Tests
- #@TestName Replication: Changelog: Changelog Purge
- #@TestID Changelog Purge
- #@TestPurpose Check replication changelog is purged after the
- purge delay specified in the conf expires
- #@TestPreamble
- #@TestSteps Set purge delay to 20 seconds on server A
- #@TestSteps Add entry X to server A
- #@TestSteps Add entry Y to server A
- #@TestSteps Search changelogs and check for made change
- #@TestSteps Let purge delay expire (sleep for 30 seconds)
- #@TestSteps Search changelogs and check for made change
- #@TestPostamble
- #@TestResult Success if the corresponding change for entry X
- can be found in every changelog before the purge
- delay expires but not any more on server A's
- after the delay expires (entry Y will still be
- there though since the last change is always
- kept)
- -->
- <testcase name="getTestCaseName('Changelog Purge')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Changelog: Changelog Purge. \
- Check replication changelog is purged after the purge delay \
- specified in the conf expires'
- </message>
-
- <script>
- if globalSplitServers:
- masterReplServer = _topologyReplServerList[0]
- else:
- masterReplServer = master
-
- masterReplServerHost = masterReplServer.getHostname()
- masterReplServerPath = '%s/%s' % \
- (masterReplServer.getDir(), OPENDSNAME)
- </script>
-
- <message>
- 'Set purge delay to 20 seconds on server %s:%s' \
- % (masterReplServerHost, masterReplServer.getPort())
- </message>
-
- <!-- Set purge delay to 20s on "master" server -->
- <call function="'dsconfigSet'">
- { 'location' : masterReplServerHost,
- 'dsPath' : masterReplServerPath,
- 'dsInstanceHost' : masterReplServerHost,
- 'dsInstanceAdminPort' : masterReplServer.getAdminPort(),
- 'dsInstanceDn' : masterReplServer.getRootDn(),
- 'dsInstancePswd' : masterReplServer.getRootPwd(),
- 'objectName' : 'replication-server' ,
- 'propertyType' : 'provider',
- 'propertyName' : 'Multimaster Synchronization',
- 'attributeName' : 'replication-purge-delay' ,
- 'attributeValue' : '20s'
- }
- </call>
-
- <!-- Add entry X to "master" server -->
- <script>
- userDnX = 'uid=iabizen.X, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen.X')
- listAttr.append('sn:Abizen.X')
- listAttr.append('cn:Izen Abizen.X')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDnX,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Add entry Y to "master" server -->
- <script>
- userDnY = 'uid=iabizen.Y, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen.Y')
- listAttr.append('sn:Abizen.Y')
- listAttr.append('cn:Izen Abizen.Y')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDnY,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Let some time for the changes to propagate -->
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 2000 }
- </call>
-
- <!-- Search changelog in the various replication servers -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
- <call function="'ldapSearchWithScript'">
- {
- 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges' ,
- 'dsFilter' : 'uid=iabizen.X',
- 'dsAttributes' : 'dn'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <!-- expect entry returned => len(searchResult) > 0
- =====> resultLength = 1 -->
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
- </sequence>
- </paralleliterate>
-
-
- <!-- Let the purge delay expire: sleep for 60s -->
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 60000 }
- </call>
-
- <!-- Search changelog in the various replication servers -->
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
- <call function="'ldapSearchWithScript'">
- {
- 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=iabizen.X',
- 'dsAttributes' : 'dn',
- 'expectedRC' : 0
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
-
- if i == 0:
- # index [0] corresponds to "master" repl server
- # => purge delay expired => changelog purged
- # => expect NO entry returned
- # => len(searchResult) = 0 => resultLength = 0
- myExpectedRC = 0
- # if entry not purged => we may have run into Issue 3736
- # (Dynamic purge delay change not taken into account)
- myKnownIssue = '3736'
- else:
- # purge delay not expired (default purge delay: 1 day)
- # => expect entry returned
- # => len(searchResult) > 0 => resultLength = 1
- myExpectedRC = 1
- myKnownIssue = None
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : myExpectedRC,
- 'issue' : myKnownIssue
- }
- </call>
-
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication Changelog' }
- </call>
-
- <call function="'testSuite_Postamble'"/>
- </sequence>
+ </try>
</block>
</sequence>
</function>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog_tests.xml
new file mode 100644
index 0000000..2005f4d
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog_tests.xml
@@ -0,0 +1,1529 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2008-2009 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Changelog Tests
+ #@TestName Replication: Changelog: Search
+ #@TestID Search
+ #@TestPurpose Check replication changelog can be searched and
+ look up changes
+ #@TestPreamble
+ #@TestSteps Add entry to server A
+ #@TestSteps Modify entry on server A
+ #@TestSteps Search changelogs and check for made changes
+ #@TestPostamble
+ #@TestResult Success if the corresponding changes can be
+ found in the changelog
+ -->
+ <function name="replication_changelog_001" scope="local">
+ <testcase name="getTestCaseName('Search')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication changelog can be searched and look up changes.' % msg1 }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <script>
+ userDn = 'uid=iabizen.0, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen.0')
+ listAttr.append('sn:Abizen.0')
+ listAttr.append('cn:Izen Abizen.0')
+ listAttr.append('l:ICNC')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : userDn,
+ 'attributeName' : 'l',
+ 'newAttributeValue' : 'GEC',
+ 'changetype' : 'replace',
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Let some time for the change to propagate -->
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 2000 }
+ </call>
+
+ <!-- Search changelog in the various replication servers -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for entry add -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=iabizen.0',
+ 'dsAttributes' : 'dn'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <!-- expect entry returned => len(searchResult) > 0
+ =====> resultLength = 1 -->
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+ <!-- Search for entry modify -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'l=GEC',
+ 'dsAttributes' : 'dn'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <!-- expect entry returned => len(searchResult) > 0
+ =====> resultLength = 1 -->
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+ </sequence>
+ </paralleliterate>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Changelog Tests
+ #@TestName Replication: Changelog: Export (on-line)
+ #@TestID Export (on-line)
+ #@TestPurpose Check replication changelog can be exported
+ on-line and look up changes
+ #@TestPreamble
+ #@TestSteps Add entry to server A
+ #@TestSteps Export every changelog to ldif file
+ #@TestSteps Check for added entry in each exported changelog
+ file
+ #@TestPostamble
+ #@TestResult Success if the corresponding change can be found
+ in the exported changelog files
+ -->
+ <function name="replication_changelog_002" scope="local">
+ <testcase name="getTestCaseName('Export (on-line)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication changelog can be exported on-line and look up changes.' % msg1 }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <script>
+ userDn = 'uid=iabizen.2, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen.2')
+ listAttr.append('sn:Abizen.2')
+ listAttr.append('cn:Izen Abizen.2')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Let some time for the change to propagate -->
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 2000 }
+ </call>
+
+ <!-- Export changelog in the various replication servers, then
+ check for added entry in the exported files -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+
+ replServerBackupDir = '%s' % replServer.getTmpDir()
+
+ </script>
+
+ <!-- Export changelog data from server -->
+ <call function="'exportLdifWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'ldifFile' : '%s/replication/changelog_export_online.ldif' \
+ % replServerBackupDir,
+ 'backEnd' : 'replicationChanges'
+ }
+ </call>
+
+ <!-- Check for the added entry inside the exported file -->
+ <call function="'grep'">
+ {
+ 'location' : replServer.getHostname(),
+ 'filename' : '%s/replication/changelog_export_online.ldif' \
+ % replServerBackupDir,
+ 'testString' : 'uid=iabizen.2'
+ }
+ </call>
+
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Changelog Tests
+ #@TestName Replication: Changelog:
+ Backup-restore (off-line)
+ #@TestID Backup-restore (off-line)
+ #@TestPurpose Check replication changelog can be backuped and
+ restored off-line
+ #@TestPreamble Backup server suffix
+ #@TestSteps Add entry A to server
+ #@TestSteps Stop servers
+ #@TestSteps Backup every changelog
+ #@TestSteps Start servers
+ #@TestSteps Add entry B to server
+ #@TestSteps Stop servers
+ #@TestSteps Restore server suffix (without entries A and B)
+ #@TestSteps Restore every changelog
+ #@TestSteps Start servers
+ #@TestSteps Check for added entry A in changelog and server
+ #@TestSteps Check for added entry B in changelog and server
+ #@TestPostamble
+ #@TestResult Success if the search for entry A succeeds and
+ the search for entry B fails
+ -->
+ <function name="replication_changelog_003" scope="local">
+ <testcase name="getTestCaseName('Backup-restore (off-line)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication changelog can be backed up and restored off-line.' % msg1 }
+ </call>
+
+ <!-- Backup "master" server -->
+ <message>
+ '+++++ binary copy off-line: back-up server %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'backup'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'backupDir' : '%s/replication/master_backup' % masterBackupDir
+ }
+ </call>
+
+ <!-- Add entry A to "master" server -->
+ <script>
+ userDnA = 'uid=iabizen.A, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen.A')
+ listAttr.append('sn:Abizen.A')
+ listAttr.append('cn:Izen Abizen.A')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDnA,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Let some time for the change to propagate -->
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 2000 }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <script>
+ if globalSplitServers:
+ serverList = _topologyReplServerList
+ else:
+ serverList = _topologyServerList
+ </script>
+ <call function="'stopServers'">
+ [serverList]
+ </call>
+
+ <!-- Backup changelog in the various replication servers -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ replServerDataDir = '%s' % replServer.getDataDir()
+ replServerBackupDir = '%s' % replServer.getTmpDir()
+ </script>
+
+ <call function="'backup'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'backupDir' : '%s/replication/changelog_backup' \
+ % replServerBackupDir,
+ 'backEnd' : 'replicationChanges'
+ }
+ </call>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Start the servers in the topology -->
+ <script>
+ if globalSplitServers:
+ serverList = _topologyReplServerList
+ else:
+ serverList = _topologyServerList
+ </script>
+ <call function="'startServers'">
+ [serverList]
+ </call>
+
+ <!-- Add entry B to "master" server -->
+ <script>
+ userDnB = 'uid=iabizen.B, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen.B')
+ listAttr.append('sn:Abizen.B')
+ listAttr.append('cn:Izen Abizen.B')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDnB,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Let some time for the change to propagate -->
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 2000 }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <call function="'stopServers'">
+ [_splitServerList]
+ </call>
+
+
+ <!-- Restore master_backup in every server, then restore
+ changelog_backup in the various replication servers -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+
+ serverBackupDir = '%s' % server.getTmpDir()
+ replServerDataDir = '%s' % replServer.getDataDir()
+ replServerBackupDir = '%s' % replServer.getTmpDir()
+ </script>
+
+ <!-- Restore master_backup -->
+ <if expr="i != 0">
+ <!-- _topologyServerList[0] corresponds to "master", so
+ no need to copy the files for that case -->
+ <sequence>
+ <!-- TODO: check what schematokens.dat files are? -->
+ <if expr="os.path.exists
+ ('%s/config/schematokens.dat' % dsPath)" >
+ <call function="'copyFile'">
+ { 'location' : masterHost,
+ 'remotehost' : server.getHostname(),
+ 'srcfile' : '%s/config/schematokens.dat' \
+ % masterPath,
+ 'destfile' : '%s/config/schematokens.dat' \
+ % serverPath
+ }
+ </call>
+ </if>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : masterHost,
+ 'remotehost' : server.getHostname(),
+ 'srcfolder' : masterBackupDir,
+ 'destfolder' : '%s/replication/master_backup' \
+ % serverBackupDir,
+ 'extension' : '*'
+ }
+ </call>
+ </sequence>
+ </if>
+ <call function="'restore'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'backupDir' : '%s/replication/master_backup' \
+ % serverBackupDir
+ }
+ </call>
+
+ <!-- Restore changelog_backup -->
+ <call function="'restore'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'backupDir' : '%s/replication/changelog_backup' \
+ % replServerBackupDir
+ }
+ </call>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Start the servers in the topology -->
+ <call function="'startServers'">
+ [_splitServerList]
+ </call>
+
+
+
+ <!-- Search synchroSuffix and changelog in the various servers,
+ looking for entries A (should be there) and B (shouldn't be) -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for entry A (should be there) -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : userDnA,
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 0
+ }
+ </call>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=iabizen.A',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <!-- expect entry returned => len(searchResult) > 0
+ =====> resultLength = 1 -->
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+ <!-- Search for entry B (should NOT be there) -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : userDnB,
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 32
+ }
+ </call>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=iabizen.B',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <!-- expect NO entry returned => len(searchResult) = 0
+ =====> resultLength = 0 -->
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 0
+ }
+ </call>
+
+ </sequence>
+ </paralleliterate>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!-- Due to the impossibility to ensure all the restore operations (of both
+ db and changelogs) are done at the very same time, there's no controlling
+ the output of this testcase.
+ -->
+ <!--- Test Case information
+ #@TestMarker Replication Changelog Tests
+ #@TestName Replication: Changelog: Backup-restore (on-line)
+ #@TestID Backup-restore (on-line)
+ #@TestPurpose Check replication changelog can be backuped and
+ restored on-line
+ #@TestPreamble Backup server suffix (done at the beginning of
+ the test suite)
+ #@TestSteps Add entry AA to server
+ #@TestSteps Backup every changelog
+ #@TestSteps Add entry BB to server
+ #@TestSteps Restore every changelog
+ #@TestSteps Restore server suffix (without entries AA and BB)
+ #@TestSteps Check for added entry AA in changelog and server
+ #@TestSteps Check for added entry BB in changelog and server
+ #@TestPostamble
+ #@TestResult Success if the search for entry AA succeeds and
+ the search for entry BB fails
+ -->
+ <function name="replication_changelog_004" scope="local">
+ <testcase name="getTestCaseName('Backup-restore (on-line)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication changelog can be backed up and restored on-line.' % msg1 }
+ </call>
+
+ <!-- Add entry AA to "master" server -->
+ <script>
+ userDnAA = 'uid=iabizen.AA, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen.AA')
+ listAttr.append('sn:Abizen.AA')
+ listAttr.append('cn:Izen Abizen.AA')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDnAA,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Let some time for the change to propagate -->
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 2000 }
+ </call>
+
+ <!-- Backup changelog in the various replication servers -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+
+ replServerBackupDir = '%s' % replServer.getTmpDir()
+ </script>
+
+ <call function="'backupTask'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'taskID' : 'changelog backup task',
+ 'backupDir' : '%s/replication/changelog_backup_online' \
+ % replServerBackupDir,
+ 'backEnd' : 'replicationChanges'
+ }
+ </call>
+ </sequence>
+ </paralleliterate>
+
+
+ <!-- Add entry BB to "master" server -->
+ <script>
+ userDnBB = 'uid=iabizen.BB, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen.BB')
+ listAttr.append('sn:Abizen.BB')
+ listAttr.append('cn:Izen Abizen.BB')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDnBB,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Let some time for the change to propagate -->
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 2000 }
+ </call>
+
+ <!-- Restore changelog_backup_online in the various replication
+ servers, then restore master_backup in every server -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+
+ serverBackupDir = '%s' % server.getTmpDir()
+ replServerBackupDir = '%s' % replServer.getTmpDir()
+
+ </script>
+
+ <!-- Restore changelog_backup -->
+ <call function="'restoreTask'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'taskID' : 'changelog restore task',
+ 'backupDir' : '%s/replication/changelog_backup_online' \
+ % replServerBackupDir
+ }
+ </call>
+
+ <!-- Restore master_backup -->
+ <if expr="i != 0">
+ <!-- _topologyServerList[0] corresponds to "master", so
+ no need to copy the files for that case -->
+ <sequence>
+ <if expr="os.path.exists
+ ('%s/config/schematokens.dat' % dsPath)" >
+ <call function="'copyFile'">
+ { 'location' : masterHost,
+ 'remotehost' : server.getHostname(),
+ 'srcfile' : '%s/config/schematokens.dat' \
+ % masterPath,
+ 'destfile' : '%s/config/schematokens.dat' \
+ % serverPath
+ }
+ </call>
+ </if>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : masterHost,
+ 'remotehost' : server.getHostname(),
+ 'srcfolder' : masterBackupDir,
+ 'destfolder' : '%s/replication/master_backup' \
+ % serverBackupDir,
+ 'extension' : '*'
+ }
+ </call>
+ </sequence>
+ </if>
+ <call function="'restoreTask'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'taskID' : 'restore task',
+ 'backupDir' : '%s/replication/master_backup' \
+ % serverBackupDir
+ }
+ </call>
+
+ </sequence>
+ </paralleliterate>
+
+
+ <!-- Search synchroSuffix and changelog in the various servers,
+ looking for entries AA (should be there) and BB (shouldn't be)
+ -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+
+ <!-- Search for entry AA (should be there) -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : userDnAA,
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 0
+ }
+ </call>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=iabizen.AA',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <!-- expect entry returned => len(searchResult) > 0
+ =====> resultLength = 1 -->
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+ <!-- Search for entry BB (should NOT be there) -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : userDnBB,
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 32
+ }
+ </call>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=iabizen.BB',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <!-- expect NO entry returned => len(searchResult) = 0
+ =====> resultLength = 0 -->
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 0
+ }
+ </call>
+
+ </sequence>
+ </paralleliterate>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Changelog Tests
+ #@TestName Replication: Changelog: Changelog Reset
+ #@TestID Changelog Reset
+ #@TestPurpose Check replication changelog is reset by
+ dsreplication pre/post-external-initialize
+ #@TestPreamble
+ #@TestSteps Add entry to server A
+ #@TestSteps Search changelogs and check for made change
+ #@TestSteps Reset changelog (call pre/post-external init)
+ #@TestSteps Search changelogs and check for made change
+ #@TestPostamble
+ #@TestResult Success if the corresponding change can be found
+ in the changelog prior to the reset but not any
+ more after the reset
+ -->
+ <function name="replication_changelog_005" scope="local">
+ <testcase name="getTestCaseName('Changelog Reset')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication changelog is reset by dsreplication pre/post-external-initialize.' % msg1 }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <script>
+ userDn = 'uid=iabizen.3, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen.3')
+ listAttr.append('sn:Abizen.3')
+ listAttr.append('cn:Izen Abizen.3')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Let some time for the change to propagate -->
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 2000 }
+ </call>
+
+ <!-- Search changelog in the various replication servers -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges' ,
+ 'dsFilter' : 'uid=iabizen.3',
+ 'dsAttributes' : 'dn'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <!-- expect entry returned => len(searchResult) > 0
+ =====> resultLength = 1 -->
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+ </sequence>
+ </paralleliterate>
+
+
+ <!-- Reset the changelog (call pre/post-external-init) -->
+ <call function="'resetReplicationData'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'sourceInstanceHost' : masterHost,
+ 'sourceInstancePort' : master.getPort(),
+ 'sourceInstanceAdminPort' : master.getAdminPort(),
+ 'sourceInstanceDn' : master.getRootDn(),
+ 'sourceInstancePswd' : master.getRootPwd(),
+ 'backupDir' : masterBackupDir,
+ 'suffixDn' : synchroSuffix
+ }
+ </call>
+
+ <!-- Search changelog in the various replication servers -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for entry in the suffix (should NOT be there) -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : userDn,
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 32
+ }
+ </call>
+ <!-- Search for corresponding change in the changelog
+ (should NOT be there) -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=iabizen.3',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <!-- expect NO entry returned => len(searchResult) = 0
+ =====> resultLength = 0 -->
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 0
+ }
+ </call>
+
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Changelog Tests
+ #@TestName Replication: Changelog: Changelog Purge
+ #@TestID Changelog Purge
+ #@TestPurpose Check replication changelog is purged after the
+ purge delay specified in the conf expires
+ #@TestPreamble
+ #@TestSteps Set purge delay to 20 seconds on server A
+ #@TestSteps Add entry X to server A
+ #@TestSteps Add entry Y to server A
+ #@TestSteps Search changelogs and check for made change
+ #@TestSteps Let purge delay expire (sleep for 30 seconds)
+ #@TestSteps Search changelogs and check for made change
+ #@TestPostamble
+ #@TestResult Success if the corresponding change for entry X
+ can be found in every changelog before the purge
+ delay expires but not any more on server A's
+ after the delay expires (entry Y will still be
+ there though since the last change is always kept)
+ -->
+ <function name="replication_changelog_006" scope="local">
+ <testcase name="getTestCaseName('Changelog Reset')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication changelog is purged after purge delay period expires].' % msg1 }
+ </call>
+
+ <script>
+ if globalSplitServers:
+ masterReplServer = _topologyReplServerList[0]
+ else:
+ masterReplServer = master
+
+ masterReplServerHost = masterReplServer.getHostname()
+ masterReplServerPath = '%s/%s' % \
+ (masterReplServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Set purge delay to 20 seconds on server %s:%s' \
+ % (masterReplServerHost, masterReplServer.getPort())
+ </message>
+
+ <!-- Set purge delay to 20s on "master" server -->
+ <call function="'dsconfigSet'">
+ { 'location' : masterReplServerHost,
+ 'dsPath' : masterReplServerPath,
+ 'dsInstanceHost' : masterReplServerHost,
+ 'dsInstanceAdminPort' : masterReplServer.getAdminPort(),
+ 'dsInstanceDn' : masterReplServer.getRootDn(),
+ 'dsInstancePswd' : masterReplServer.getRootPwd(),
+ 'objectName' : 'replication-server' ,
+ 'propertyType' : 'provider',
+ 'propertyName' : 'Multimaster Synchronization',
+ 'attributeName' : 'replication-purge-delay' ,
+ 'attributeValue' : '20s'
+ }
+ </call>
+
+ <!-- Add entry X to "master" server -->
+ <script>
+ userDnX = 'uid=iabizen.X, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen.X')
+ listAttr.append('sn:Abizen.X')
+ listAttr.append('cn:Izen Abizen.X')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDnX,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Add entry Y to "master" server -->
+ <script>
+ userDnY = 'uid=iabizen.Y, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen.Y')
+ listAttr.append('sn:Abizen.Y')
+ listAttr.append('cn:Izen Abizen.Y')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDnY,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Let some time for the changes to propagate -->
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 2000 }
+ </call>
+
+ <!-- Search changelog in the various replication servers -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges' ,
+ 'dsFilter' : 'uid=iabizen.X',
+ 'dsAttributes' : 'dn'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <!-- expect entry returned => len(searchResult) > 0
+ =====> resultLength = 1 -->
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+ </sequence>
+ </paralleliterate>
+
+
+ <!-- Let the purge delay expire: sleep for 60s -->
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 60000 }
+ </call>
+
+ <!-- Search changelog in the various replication servers -->
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <call function="'ldapSearchWithScript'">
+ {
+ 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=iabizen.X',
+ 'dsAttributes' : 'dn',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+
+ if i == 0:
+ # index [0] corresponds to "master" repl server
+ # => purge delay expired => changelog purged
+ # => expect NO entry returned
+ # => len(searchResult) = 0 => resultLength = 0
+ myExpectedRC = 0
+ # if entry not purged => we may have run into Issue 3736
+ # (Dynamic purge delay change not taken into account)
+ myKnownIssue = '3736'
+ else:
+ # purge delay not expired (default purge delay: 1 day)
+ # => expect entry returned
+ # => len(searchResult) > 0 => resultLength = 1
+ myExpectedRC = 1
+ myKnownIssue = None
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : myExpectedRC,
+ 'issue' : myKnownIssue
+ }
+ </call>
+
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml
index 4de257a..9afe7ff 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml
@@ -7,3561 +7,206 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Portions Copyright 2006-2009 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
-
<defaultcall function="replication_conflict"/>
-
- <function name="replication_conflict">
-
+ <function name="replication_conflict" scope="local">
<sequence>
+ <block name="'replication_conflict'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'conflict'
+
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication Conflict'
+ </script>
- <block name="'conflict'">
-
- <sequence>
-
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication Conflict Tests
- #@TestSuitePurpose Verify that replication handles the conflicts
- all right
- #@TestSuiteID Conflict Tests
- #@TestSuiteGroup Conflict
- #@TestGroup Replication
- #@TestScript replication_failover.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'">
- { 'topologyFile' : '%s/basic_topology.txt' \
- % REPLICATION_CONFIG_DIR,
- 'dataFile' : 'Short_Example.ldif',
- 'isolateLdapServers' : True,
- 'enableDebugLogs' : False,
- 'label' : 'Replication Conflict'
- }
- </call>
-
-
- <script>
- server1 = _topologyServerList[0]
- server2 = _topologyServerList[1]
- server1Host = server1.getHostname()
- server2Host = server2.getHostname()
- server1Path = '%s/%s' % (server1.getDir(), OPENDSNAME)
- server2Path = '%s/%s' % (server2.getDir(), OPENDSNAME)
- server1name = '%s:%s' % (server1Host, server1.getPort())
- server2name = '%s:%s' % (server2Host, server2.getPort())
-
- if globalSplitServers:
- replServer1 = _topologyReplServerList[0]
- replServer2 = _topologyReplServerList[1]
- else:
- replServer1 = server1
- replServer2 = server2
-
- # Filter used for retrieving conflict counters from cn=monitor
- filter0 = '(base-dn=%s)' % synchroSuffix
- filter1 = '(cn=Replication Plugin*)'
- monitorFilter = '&%s%s' % (filter0, filter1)
- monitorCounters = 'resolved-naming-conflicts \
- unresolved-naming-conflicts \
- resolved-modify-conflicts'
-
- addedEntries = STAXGlobal( [[], []] )
-
- class Entry:
- def __init__(self, rdn):
- self.userDn = '%s, ou=People, %s' \
- % (rdn, synchroSuffix)
- self.listAttr = []
- self.listAttr.append('objectclass:top')
- self.listAttr.append('objectclass:organizationalperson')
- self.listAttr.append('objectclass:inetorgperson')
- self.listAttr.append('objectclass:person')
- self.listAttr.append('sn:User')
- self.listAttr.append('cn:Test User')
- def getDn(self):
- return self.userDn
- def getAttrList(self):
- return self.listAttr
- def addAttr(self, attrType, attrValue):
- self.listAttr.append('%s:%s' % (attrType, attrValue))
- </script>
- <!-- ============================================== -->
- <!-- ============================================== -->
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: Basic check
- #@TestID Basic check
- #@TestPurpose Check replication assures synchronization after
- a simultaneous conflictuous modify on 2
- different servers (regardless of the prevailing
- modify)
- #@TestPreamble
- #@TestSteps Add entry to server1 with employeeNumber:0
- #@TestSteps Parallel replace
- server1: employeeNumber -> 1
- server2: employeeNumber -> 2
- #@TestSteps Check entry consistent on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('Basic check')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: Basic check 0. \
- Check replication assures synchronization after a simultaneous \
- conflictuous modify on 2 different servers (regardless of the \
- prevailing modify)'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('uid=tuser-0')
- myEntry.addAttr('employeeNumber', '0')
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 2000 }
- </call>
-
- <paralleliterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'attributeName' : 'employeeNumber',
- 'newAttributeValue' : '%i' % (i + 1),
- 'changetype' : 'replace'
- }
- </call>
- </paralleliterate>
-
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'employeeNumber',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_replace_multi
- #@TestID double_replace_multi
- #@TestPurpose Double replace a multi-valued attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with description:{1 2}
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: replace description -> {3 4}
- #@TestSteps server2: replace description -> {5 6}
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description={5 6} on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_replace_multi')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_replace_multi. \
- Double replace a multi-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=A1')
- myEntry.addAttr('description', '1')
- myEntry.addAttr('description', '2')
- server1mods = ['description:3', 'description:4']
- server2mods = ['description:5', 'description:6']
- mods = [server1mods, server2mods]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i],
- 'changetype' : 'replace'
- }
- </call>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_replace_single
- #@TestID double_replace_single
- #@TestPurpose Double replace a single-valued attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with employeeNumber:0
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: replace employeeNumber -> 1
- #@TestSteps server2: replace employeeNumber -> 2
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check employeeNumber=2 on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_replace_single')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_replace_single. \
- Double replace a single-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=A4')
- myEntry.addAttr('employeeNumber', '0')
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'attributeName' : 'employeeNumber',
- 'newAttributeValue' : '%i' % (i + 1),
- 'changetype' : 'replace'
- }
- </call>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'employeeNumber',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'employeeNumber',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_mod_del_add_multi_1
- #@TestID double_mod_del_add_multi_1
- #@TestPurpose Double replace (del+add) same value with any
- value of a multi-valued attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with
- description:{1 2 3 4 5 6 7 8 9 10}
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: del description=1 + add description=11
- #@TestSteps server2: del description=1 + add description=12
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description={2 3 4 5 6 7 8 9 10 11 12}
- on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_mod_del_add_multi_1')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_mod_del_add_multi_1. \
- Double replace (del+add) same value with any value of a \
- multi-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=A2')
- for x in range(10):
- myEntry.addAttr('description', '%i' % (x+1))
- server1del = ['description:1']
- server1add = ['description:11']
- server2del = ['description:1']
- server2add = ['description:12']
- server1mods = [server1del, server1add]
- server2mods = [server2del, server2add]
- mods = [server1mods, server2mods]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : 'delete'
- }
- </call>
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][1],
- 'changetype' : 'add'
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_mod_del_add_multi_2
- #@TestID double_mod_del_add_multi_2
- #@TestPurpose Double replace (del+add) any value with same
- value of a multi-valued attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with
- description:{1 2 3 4 5 6 7 8 9 10}
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: del description=1 + add description=11
- #@TestSteps server2: del description=10 + add description=11
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description={2 3 4 5 6 7 8 9 11}
- on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_mod_del_add_multi_2')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_mod_del_add_multi_2. \
- Double replace (del+add) any value with same value of a \
- multi-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=A3')
- for x in range(10):
- myEntry.addAttr('description', '%i' % (x+1))
- server1del = ['description:1']
- server1add = ['description:11']
- server2del = ['description:10']
- server2add = ['description:11']
- server1mods = [server1del, server1add]
- server2mods = [server2del, server2add]
- mods = [server1mods, server2mods]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : 'delete'
- }
- </call>
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][1],
- 'changetype' : 'add'
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_mod_add_multi
- #@TestID double_mod_add_multi
- #@TestPurpose Double mod_add a multi-valued attribute
- #@TestPreamble
- #@TestSteps Add entry to server1
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: add description=1
- #@TestSteps server2: add description={1 2}
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description={1 2} on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_mod_add_multi')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_mod_add_multi. \
- Double mod_add a multi-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=B1')
- server1add = ['description:1']
- server2add = ['description:1', 'description:2']
- server1mods = [server1add]
- server2mods = [server2add]
- mods = [server1mods, server2mods]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : 'add'
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_mod_add_single
- #@TestID double_mod_add_single
- #@TestPurpose Double mod_add a single-valued attribute
- #@TestPreamble
- #@TestSteps Add entry to server1
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: add employeeNumber=1
- #@TestSteps server2: add employeeNumber=2
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check employeeNumber=1 on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_mod_add_single')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_mod_add_single. \
- Double mod_add a single-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=B2')
- server1add = ['employeeNumber:1']
- server2add = ['employeeNumber:2']
- server1mods = [server1add]
- server2mods = [server2add]
- mods = [server1mods, server2mods]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : 'add'
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'employeeNumber',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'employeeNumber',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_mod_del_multi
- #@TestID double_mod_del_multi
- #@TestPurpose Double mod_delete a multi-valued attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with
- description:{1 2 3 4 5 6 7 8 9 10}
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: delete description={1 2 3 4 5}
- #@TestSteps server2: delete description={4 5 6 7 8}
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description={9 10} on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_mod_del_multi')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_mod_del_multi. \
- Double mod_delete a multi-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=C1')
- for x in range(10):
- myEntry.addAttr('description', '%i' % (x+1))
- server1del = []
- for y in range(1,6):
- server1del.append('description:%i' % y)
- server2del = []
- for z in range(4,9):
- server2del.append('description:%i' % z)
- server1mods = [server1del]
- server2mods = [server2del]
- mods = [server1mods, server2mods]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : 'delete'
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_mod_del_single
- #@TestID double_mod_del_single
- #@TestPurpose Double mod_delete a single-valued attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with employeeNumber=1
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: delete employeeNumber
- #@TestSteps server2: delete employeeNumber=1
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check employeeNumber no longer exists on either
- server
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_mod_del_single')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_mod_del_single. \
- Double mod_delete a single-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=C2')
- myEntry.addAttr('employeeNumber', '1')
- server1del = ['employeeNumber:']
- server2del = ['employeeNumber:1']
- server1mods = [server1del]
- server2mods = [server2del]
- mods = [server1mods, server2mods]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : 'delete'
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'employeeNumber',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'employeeNumber',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict:
- mod_del_add_vs_mod_add_del_multi
- #@TestID mod_del_add_vs_mod_add_del_multi
- #@TestPurpose Modify: Delete+Add then Add+Delete on 2
- multi-valued attributes
- #@TestPreamble
- #@TestSteps Add entry to server1 with
- description=1 , telephoneNumber=1
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: add description=2 ,
- delete telephoneNumber
- #@TestSteps server2: delete description ,
- add telephoneNumber=2
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description no longer exists and
- telephoneNumber=2 on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('mod_del_add_vs_mod_add_del_multi')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: mod_del_add_vs_mod_add_del_multi. \
- Modify: Delete+Add then Add+Delete on 2 multi-valued attributes'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=D1')
- myEntry.addAttr('description', '1')
- myEntry.addAttr('telephoneNumber', '1')
- server1add = ['description:2']
- server1del = ['telephoneNumber:']
- server2del = ['description:']
- server2add = ['telephoneNumber:2']
- server1mods = [server1add, server1del]
- server2mods = [server2del, server2add]
- mods = [server1mods, server2mods]
- server1changetypes = ['add', 'delete']
- server2changetypes = ['delete', 'add']
- changetypes = [server1changetypes, server2changetypes]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : changetypes[i][0]
- }
- </call>
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][1],
- 'changetype' : changetypes[i][1]
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description telephoneNumber',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description telephoneNumber',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict:
- mod_add_vs_mod_replace_multi
- #@TestID mod_add_vs_mod_replace_multi
- #@TestPurpose mod_add vs mod_replace on a multi-valued
- attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with description=1
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: add description={2 3}
- #@TestSteps server2: replace description -> {4 5}
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description={4 5} on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('mod_add_vs_mod_replace_multi')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: mod_add_vs_mod_replace_multi. \
- mod_add vs mod_replace on a multi-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=E1')
- myEntry.addAttr('description', '1')
- server1add = ['description:2', 'description:3']
- server2replace = ['description:4', 'description:5']
- server1mods = [server1add]
- server2mods = [server2replace]
- mods = [server1mods, server2mods]
- server1changetypes = ['add']
- server2changetypes = ['replace']
- changetypes = [server1changetypes, server2changetypes]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : changetypes[i][0]
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict:
- mod_replace_vs_mod_add_multi
- #@TestID mod_replace_vs_mod_add_multi
- #@TestPurpose mod_replace vs mod_add on a multi-valued
- attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with description=1
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: replace description -> {2 3}
- #@TestSteps server2: add description={4 5}
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description={2 3 4 5} on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('mod_replace_vs_mod_add_multi')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: mod_replace_vs_mod_add_multi. \
- mod_replace vs mod_add on a multi-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=E2')
- myEntry.addAttr('description', '1')
- server1replace = ['description:2', 'description:3']
- server2add = ['description:4', 'description:5']
- server1mods = [server1replace]
- server2mods = [server2add]
- mods = [server1mods, server2mods]
- server1changetypes = ['replace']
- server2changetypes = ['add']
- changetypes = [server1changetypes, server2changetypes]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : changetypes[i][0]
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict:
- mod_del_vs_mod_replace_multi
- #@TestID mod_del_vs_mod_replace_multi
- #@TestPurpose mod_del vs mod_replace on a multi-valued
- attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with
- description={1 2 3 4}
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: delete description={2 3}
- #@TestSteps server2: replace description -> {6 7 8 9 10}
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description={6 7 8 9 10} on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('mod_del_vs_mod_replace_multi')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: mod_del_vs_mod_replace_multi. \
- mod_del vs mod_replace on a multi-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=F1')
- for x in range(4):
- myEntry.addAttr('description', '%i' % (x+1))
- server1del = ['description:2', 'description:3']
- server2replace = []
- for y in range(6,11):
- server2replace.append('description:%i' % y)
- server1mods = [server1del]
- server2mods = [server2replace]
- mods = [server1mods, server2mods]
- server1changetypes = ['delete']
- server2changetypes = ['replace']
- changetypes = [server1changetypes, server2changetypes]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : changetypes[i][0]
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict:
- mod_replace_vs_mod_del_multi
- #@TestID mod_replace_vs_mod_del_multi
- #@TestPurpose mod_replace vs mod_del on a multi-valued
- attribute
- #@TestPreamble
- #@TestSteps Add entry to server1 with
- description={1 2 3 4}
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: replace description -> {1 2 3}
- #@TestSteps server2: delete description={3 4}
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check description={1 2} on both servers
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('mod_replace_vs_mod_del_multi')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: mod_replace_vs_mod_del_multi. \
- mod_replace vs mod_del on a multi-valued attribute'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- myEntry = Entry('cn=F2')
- for x in range(4):
- myEntry.addAttr('description', '%i' % (x+1))
- server1replace = ['description:1', 'description:2',
- 'description:3']
- server2del = ['description:3', 'description:4']
- server1mods = [server1replace]
- server2mods = [server2del]
- mods = [server1mods, server2mods]
- server1changetypes = ['replace']
- server2changetypes = ['delete']
- changetypes = [server1changetypes, server2changetypes]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : myEntry.getDn(),
- 'listAttributes' : myEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : myEntry.getDn(),
- 'listAttributes' : mods[i][0],
- 'changetype' : changetypes[i][0]
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : myEntry.getDn(),
- 'dsFilter' : 'objectclass=*',
- 'dsAttributes' : 'description',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix ]
- </call>
-
- <!-- Delete added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [myEntry.getDn()]
- }
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: add_child_del_parent
- #@TestID add_child_del_parent
- #@TestPurpose Add a child vs delete his parent
- #@TestPreamble
- #@TestSteps Add entry cn=P1 to server1
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server2: add child cn=C1,cn=P1
- #@TestSteps server1: delete parent cn=P1
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check servers are synchronised
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('add_child_del_parent')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: add_child_del_parent. \
- Add a child vs delete his parent'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- parentEntry = Entry('cn=P1')
- parentEntry.addAttr('givenname', 'DUMMY ENTRY')
- childEntry = Entry('cn=C1,cn=P1')
- childEntry.addAttr('givenname', 'DUMMY ENTRY')
- # addedEntries = [[], []]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : parentEntry.getDn(),
- 'listAttributes' : parentEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Add child entry on server2 -->
- <call function="'addAnEntry'">
- { 'location' : server2Host,
- 'dsPath' : server2Path,
- 'dsInstanceHost' : server2Host,
- 'dsInstancePort' : server2.getPort(),
- 'dsInstanceDn' : server2.getRootDn(),
- 'dsInstancePswd' : server2.getRootPwd(),
- 'DNToAdd' : childEntry.getDn(),
- 'listAttributes' : childEntry.getAttrList()
- }
- </call>
-
- <!-- Delete parent entry on server1-->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [parentEntry.getDn()]
- }
- </call>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'givenname=DUMMY ENTRY',
- 'dsAttributes' : 'ds-sync-conflict cn',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
-
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : 'cn=monitor',
- 'dsFilter' : monitorFilter,
- 'dsAttributes' : monitorCounters,
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'givenname=DUMMY ENTRY',
- 'dsAttributes' : 'ds-sync-conflict cn',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- <script>
- resultDnList = []
- for line in searchResult.splitlines():
- if line.find('dn: ') != -1:
- resultDn = line[len('dn: '):]
- resultDnList.append(resultDn)
- addedEntries[i] = resultDnList
- </script>
- </sequence>
- <else>
- <script>
- addedEntries[i] = []
- </script>
- </else>
- </if>
-
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : 'cn=monitor',
- 'dsFilter' : monitorFilter,
- 'dsAttributes' : monitorCounters,
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <!-- If the trees don't match, we may have come across Issue 3891
- (Replication conflict: add child , delete parent) -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix,
- '3891' ]
- </call>
-
- <!-- Delete added entries -->
- <script>
- list1 = addedEntries[0]
- list2 = addedEntries[1]
- toRemove = []
- # remove potential redundancies, to avoid deleting them twice
- for addedEntry in list2:
- if addedEntry in list1:
- toRemove.append(addedEntry)
- for ent in toRemove:
- list2.remove(ent)
- </script>
- <paralleliterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <if expr="len(addedEntries[i]) != 0">
- <paralleliterate var="entryToDelete" in="addedEntries[i]">
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsDn' : [entryToDelete]
- }
- </call>
- </paralleliterate>
- </if>
- </paralleliterate>
-
- <!-- Issue visible in the conflict counters, so not automatically
- ! detectable so far.
- <call function="'setKnownIssue'">
- { 'issueId' : '3400' }
- </call>
+ <!--- Test Suite information
+ #@TestSuiteName Replication Conflict Tests
+ #@TestSuitePurpose Verify that the conflict operations are replicated
+ correctly between two servers.
+ #@TestSuiteID Conflict Tests
+ #@TestSuiteGroup Conflict
+ #@TestGroup Replication
+ #@TestScript replication_conflict.xml
+ #@TestHTMLLink http://www.forgerock.org/
-->
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: del_parent_add_child
- #@TestID del_parent_add_child
- #@TestPurpose Delete a parent vs add his child
- #@TestPreamble
- #@TestSteps Add entry cn=P2 to server1
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: delete parent cn=P2
- #@TestSteps server2: add child cn=C2,cn=P2
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check servers are synchronised
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('del_parent_add_child')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: del_parent_add_child. \
- Delete a parent vs add his child'
- </message>
-
- <!-- Add entry to server1 -->
- <script>
- parentEntry = Entry('cn=P2')
- parentEntry.addAttr('givenname', 'DUMMY ENTRY')
- childEntry = Entry('cn=C2,cn=P2')
- childEntry.addAttr('givenname', 'DUMMY ENTRY')
- # addedEntries = [[], []]
- </script>
- <call function="'addAnEntry'">
- { 'location' : server1Host,
- 'dsPath' : server1Path,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'DNToAdd' : parentEntry.getDn(),
- 'listAttributes' : parentEntry.getAttrList()
- }
- </call>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Delete parent entry on server1-->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [parentEntry.getDn()]
- }
- </call>
-
- <!-- Add child entry on server2 -->
- <call function="'addAnEntry'">
- { 'location' : server2Host,
- 'dsPath' : server2Path,
- 'dsInstanceHost' : server2Host,
- 'dsInstancePort' : server2.getPort(),
- 'dsInstanceDn' : server2.getRootDn(),
- 'dsInstancePswd' : server2.getRootPwd(),
- 'DNToAdd' : childEntry.getDn(),
- 'listAttributes' : childEntry.getAttrList()
- }
- </call>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'givenname=DUMMY ENTRY',
- 'dsAttributes' : 'ds-sync-conflict cn',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
-
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : 'cn=monitor',
- 'dsFilter' : monitorFilter,
- 'dsAttributes' : monitorCounters,
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'givenname=DUMMY ENTRY',
- 'dsAttributes' : 'ds-sync-conflict cn',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- <script>
- resultDnList = []
- for line in searchResult.splitlines():
- if line.find('dn: ') != -1:
- resultDn = line[len('dn: '):]
- resultDnList.append(resultDn)
- addedEntries[i] = resultDnList
- </script>
- </sequence>
- <else>
- <script>
- addedEntries[i] = []
- </script>
- </else>
- </if>
-
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : 'cn=monitor',
- 'dsFilter' : monitorFilter,
- 'dsAttributes' : monitorCounters,
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <!-- If the trees don't match, we may have come across Issue 4071
- (Replication conflict: delete parent, add child) -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix,
- '4071' ]
- </call>
-
- <!-- Delete added entries -->
- <script>
- list1 = addedEntries[0]
- list2 = addedEntries[1]
- toRemove = []
- # remove potential redundancies, to avoid deleting them twice
- for addedEntry in list2:
- if addedEntry in list1:
- toRemove.append(addedEntry)
- for ent in toRemove:
- list2.remove(ent)
- </script>
- <paralleliterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <if expr="len(addedEntries[i]) != 0">
- <paralleliterate var="entryToDelete" in="addedEntries[i]">
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsDn' : [entryToDelete]
- }
- </call>
- </paralleliterate>
- </if>
- </paralleliterate>
-
- <!-- Issue visible in the conflict counters, so not automatically
- ! detectable so far.
- <call function="'setKnownIssue'">
- { 'issueId' : '3400' }
- </call>
- -->
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_add
- #@TestID double_add
- #@TestPurpose Double add (same dn, different uid)
- #@TestPreamble
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: add entry cn=F with uid=1
- #@TestSteps server2: add entry cn=F with uid=2
- #@TestSteps Re-connect Replication Servers
- #@TestSteps Check servers are synchronised
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_add')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_add. \
- Double add (same dn, different uid)'
- </message>
-
- <script>
- entry1 = Entry('cn=F')
- entry1.addAttr('uid', '1')
- entry1.addAttr('givenname', 'DUMMY ENTRY')
- entry2 = Entry('cn=F')
- entry2.addAttr('uid', '2')
- entry2.addAttr('givenname', 'DUMMY ENTRY')
-
- entriesToAdd = [entry1, entry2]
- </script>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Add entry on one of the servers -->
- <call function="'addAnEntry'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToAdd' : entriesToAdd[i].getDn(),
- 'listAttributes' : entriesToAdd[i].getAttrList()
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'givenname=DUMMY ENTRY',
- 'dsAttributes' : 'ds-sync-conflict uid cn',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
-
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : 'cn=monitor',
- 'dsFilter' : monitorFilter,
- 'dsAttributes' : monitorCounters,
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'givenname=DUMMY ENTRY',
- 'dsAttributes' : 'ds-sync-conflict uid cn',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- <script>
- resultDnList = []
- for line in searchResult.splitlines():
- if line.find('dn: ') != -1:
- resultDn = line[len('dn: '):]
- resultDnList.append(resultDn)
- addedEntries[i] = resultDnList
- </script>
- </sequence>
- <else>
- <script>
- addedEntries[i] = []
- </script>
- </else>
- </if>
-
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : 'cn=monitor',
- 'dsFilter' : monitorFilter,
- 'dsAttributes' : monitorCounters,
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <!-- If the trees don't match, we may have come across Issue OPENDJ-454
- (RFE: Solve naming conflict of 2 adds with same dn, different
- attr value) -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix,
- 'OPENDJ-454' ]
- </call>
-
- <!-- Delete added entries -->
- <script>
- list1 = addedEntries[0]
- list2 = addedEntries[1]
- toRemove = []
- # remove potential redundancies, to avoid deleting them twice
- for addedEntry in list2:
- if addedEntry in list1:
- toRemove.append(addedEntry)
- for ent in toRemove:
- list2.remove(ent)
- </script>
- <paralleliterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <if expr="len(addedEntries[i]) != 0">
- <paralleliterate var="entryToDelete" in="addedEntries[i]">
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsDn' : [entryToDelete]
- }
- </call>
- </paralleliterate>
- </if>
- </paralleliterate>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Conflict Tests
- #@TestName Replication: Conflict: double_add_single_del_1
- #@TestID double_add_single_del_1
- #@TestPurpose Add twice same dn, then delete it in one server
- #@TestPreamble
- #@TestSteps Disconnect Replication Servers
- #@TestSteps server1: add entry cn=DN1 with uid=1
- #@TestSteps server2: add entry cn=DN1 with uid=2
- #@TestSteps Re-connect Replication Servers
- #@TestSteps server1: delete entry cn=DN1
- #@TestSteps Check servers are synchronised
- #@TestPostamble
- #@TestResult Success if trees are synchronised
- -->
- <testcase name="getTestCaseName
- ('double_add_single_del_1')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Conflict: double_add_single_del_1. \
- Add twice same dn, then delete it in one server'
- </message>
-
- <script>
- entry1 = Entry('cn=DN1')
- entry1.addAttr('uid', '1')
- entry1.addAttr('givenname', 'DUMMY ENTRY')
- entry2 = Entry('cn=DN1')
- entry2.addAttr('uid', '2')
- entry2.addAttr('givenname', 'DUMMY ENTRY')
-
- entriesToAdd = [entry1, entry2]
- </script>
-
- <!-- Disconnect Replication Servers -->
- <call function="'disconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <iterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <!-- Add entry on one of the servers -->
- <call function="'addAnEntry'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToAdd' : entriesToAdd[i].getDn(),
- 'listAttributes' : entriesToAdd[i].getAttrList()
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Check modifies have not been propagated -->
- <paralleliterate var="server" in="[server1, server2]">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'givenname=DUMMY ENTRY',
- 'dsAttributes' : 'ds-sync-conflict uid cn',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
-
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : 'cn=monitor',
- 'dsFilter' : monitorFilter,
- 'dsAttributes' : monitorCounters,
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Reconnect Replication Servers -->
- <call function="'reconnectReplicationServers'">
- [ clientHost, clientPath, [replServer1, replServer2] ]
- </call>
-
- <!-- Delete entry on server1-->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server1Host,
- 'dsInstancePort' : server1.getPort(),
- 'dsInstanceDn' : server1.getRootDn(),
- 'dsInstancePswd' : server1.getRootPwd(),
- 'dsDn' : [entry1.getDn()]
- }
- </call>
-
- <!-- Check conflict is resolved -->
- <paralleliterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <sequence>
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : synchroSuffix,
- 'dsFilter' : 'givenname=DUMMY ENTRY',
- 'dsAttributes' : 'ds-sync-conflict uid cn',
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- <script>
- resultDnList = []
- for line in searchResult.splitlines():
- if line.find('dn: ') != -1:
- resultDn = line[len('dn: '):]
- resultDnList.append(resultDn)
- addedEntries[i] = resultDnList
- </script>
- </sequence>
- <else>
- <script>
- addedEntries[i] = []
- </script>
- </else>
- </if>
-
- <call function="'ldapSearchWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' \
- % (server.getDir(), OPENDSNAME),
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsBaseDN' : 'cn=monitor',
- 'dsFilter' : monitorFilter,
- 'dsAttributes' : monitorCounters,
- 'logStderr' : False
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <if expr="resultLength != 0">
- <sequence>
- <message>
- '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
- % (server.getHostname(), server.getPort(), searchResult)
- </message>
- </sequence>
- </if>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <!-- If the trees don't match, we may have come across Issue OPENDJ-454
- (RFE: Solve naming conflict of 2 adds with same dn, different
- attr value) -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, server1, [server2], synchroSuffix,
- 'OPENDJ-454' ]
- </call>
-
- <!-- Delete added entries -->
- <script>
- list1 = addedEntries[0]
- list2 = addedEntries[1]
- toRemove = []
- # remove potential redundancies, to avoid deleting them twice
- for addedEntry in list2:
- if addedEntry in list1:
- toRemove.append(addedEntry)
- for ent in toRemove:
- list2.remove(ent)
- </script>
- <paralleliterate var="server"
- in="[server1, server2]"
- indexvar="i">
- <if expr="len(addedEntries[i]) != 0">
- <paralleliterate var="entryToDelete" in="addedEntries[i]">
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'dsDn' : [entryToDelete]
- }
- </call>
- </paralleliterate>
- </if>
- </paralleliterate>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication Conflict' }
- </call>
-
- <call function="'testSuite_Postamble'"/>
- </sequence>
+ <call function="'testSuite_Preamble'"/>
+ <try>
+ <sequence>
+
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'">
+ { 'topologyFile' : '%s/basic_topology.txt' \
+ % REPLICATION_CONFIG_DIR,
+ 'dataFile' : 'Short_Example.ldif',
+ 'isolateLdapServers' : True,
+ 'enableDebugLogs' : False,
+ 'label' : _label
+ }
+ </call>
+
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('conflict/conflict_tests')
+ </script>
+
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
+
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: Conflict:'
+ server1 = _topologyServerList[0]
+ server2 = _topologyServerList[1]
+ server1Host = server1.getHostname()
+ server2Host = server2.getHostname()
+ server1Path = '%s/%s' % (server1.getDir(), OPENDSNAME)
+ server2Path = '%s/%s' % (server2.getDir(), OPENDSNAME)
+ server1name = '%s:%s' % (server1Host, server1.getPort())
+ server2name = '%s:%s' % (server2Host, server2.getPort())
+
+ if globalSplitServers:
+ replServer1 = _topologyReplServerList[0]
+ replServer2 = _topologyReplServerList[1]
+ else:
+ replServer1 = server1
+ replServer2 = server2
+
+ # Filter used for retrieving conflict counters from cn=monitor
+ filter0 = '(base-dn=%s)' % synchroSuffix
+ filter1 = '(cn=Replication Plugin*)'
+ monitorFilter = '&%s%s' % (filter0, filter1)
+ monitorCounters = 'resolved-naming-conflicts \
+ unresolved-naming-conflicts \
+ resolved-modify-conflicts'
+
+ addedEntries = STAXGlobal( [[], []] )
+
+ class Entry:
+ def __init__(self, rdn):
+ self.userDn = '%s, ou=People, %s' \
+ % (rdn, synchroSuffix)
+ self.listAttr = []
+ self.listAttr.append('objectclass:top')
+ self.listAttr.append('objectclass:organizationalperson')
+ self.listAttr.append('objectclass:inetorgperson')
+ self.listAttr.append('objectclass:person')
+ self.listAttr.append('sn:User')
+ self.listAttr.append('cn:Test User')
+ def getDn(self):
+ return self.userDn
+ def getAttrList(self):
+ return self.listAttr
+ def addAttr(self, attrType, attrValue):
+ self.listAttr.append('%s:%s' % (attrType, attrValue))
+
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_conflict_001')
+ testsList.append('replication_conflict_002')
+ testsList.append('replication_conflict_003')
+ testsList.append('replication_conflict_004')
+ testsList.append('replication_conflict_005')
+ testsList.append('replication_conflict_006')
+ testsList.append('replication_conflict_007')
+ testsList.append('replication_conflict_008')
+ testsList.append('replication_conflict_009')
+ testsList.append('replication_conflict_010')
+ testsList.append('replication_conflict_011')
+ testsList.append('replication_conflict_012')
+ testsList.append('replication_conflict_013')
+ testsList.append('replication_conflict_014')
+ testsList.append('replication_conflict_015')
+ testsList.append('replication_conflict_016')
+ testsList.append('replication_conflict_017')
+ testsList.append('replication_conflict_018')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ <catch exception="'STAFException.TestSuite.SetupException'">
+ <sequence>
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
+ </message>
+ <rethrow/>
+ </sequence>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
+
+ </try>
+
+ </sequence>
+
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </finally>
+
+ </try>
</block>
-
</sequence>
-
</function>
-
</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml
new file mode 100644
index 0000000..23d36ce
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict_tests.xml
@@ -0,0 +1,3820 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Portions Copyright 2006-2009 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: Basic check
+ #@TestID Basic check
+ #@TestPurpose Check replication assures synchronization after
+ a simultaneous conflictuous modify on 2
+ different servers (regardless of the prevailing
+ modify)
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with employeeNumber:0
+ #@TestSteps Parallel replace
+ server1: employeeNumber -> 1
+ server2: employeeNumber -> 2
+ #@TestSteps Check entry consistent on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_001" scope="local">
+ <testcase name="getTestCaseName('Basic check')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: Basic check 0. \
+ Check replication assures synchronization after a simultaneous \
+ conflictuous modify on 2 different servers (regardless of the \
+ prevailing modify)'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('uid=tuser-0')
+ myEntry.addAttr('employeeNumber', '0')
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 2000 }
+ </call>
+
+ <paralleliterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : 'employeeNumber',
+ 'newAttributeValue' : '%i' % (i + 1),
+ 'changetype' : 'replace'
+ }
+ </call>
+ </paralleliterate>
+
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'employeeNumber',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_replace_multi
+ #@TestID double_replace_multi
+ #@TestPurpose Double replace a multi-valued attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with description:{1 2}
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: replace description -> {3 4}
+ #@TestSteps server2: replace description -> {5 6}
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description={5 6} on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_002" scope="local">
+ <testcase name="getTestCaseName('double_replace_multi')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_replace_multi. \
+ Double replace a multi-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=A1')
+ myEntry.addAttr('description', '1')
+ myEntry.addAttr('description', '2')
+ server1mods = ['description:3', 'description:4']
+ server2mods = ['description:5', 'description:6']
+ mods = [server1mods, server2mods]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i],
+ 'changetype' : 'replace'
+ }
+ </call>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_replace_single
+ #@TestID double_replace_single
+ #@TestPurpose Double replace a single-valued attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with employeeNumber:0
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: replace employeeNumber -> 1
+ #@TestSteps server2: replace employeeNumber -> 2
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check employeeNumber=2 on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_003" scope="local">
+ <testcase name="getTestCaseName('double_replace_single')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_replace_single. \
+ Double replace a single-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=A4')
+ myEntry.addAttr('employeeNumber', '0')
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'attributeName' : 'employeeNumber',
+ 'newAttributeValue' : '%i' % (i + 1),
+ 'changetype' : 'replace'
+ }
+ </call>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'employeeNumber',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'employeeNumber',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_mod_del_add_multi_1
+ #@TestID double_mod_del_add_multi_1
+ #@TestPurpose Double replace (del+add) same value with any
+ value of a multi-valued attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with
+ description:{1 2 3 4 5 6 7 8 9 10}
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: del description=1 + add description=11
+ #@TestSteps server2: del description=1 + add description=12
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description={2 3 4 5 6 7 8 9 10 11 12}
+ on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_004" scope="local">
+ <testcase name="getTestCaseName('double_mod_del_add_multi_1')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_mod_del_add_multi_1. \
+ Double replace (del+add) same value with any value of a \
+ multi-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=A2')
+ for x in range(10):
+ myEntry.addAttr('description', '%i' % (x+1))
+ server1del = ['description:1']
+ server1add = ['description:11']
+ server2del = ['description:1']
+ server2add = ['description:12']
+ server1mods = [server1del, server1add]
+ server2mods = [server2del, server2add]
+ mods = [server1mods, server2mods]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : 'delete'
+ }
+ </call>
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][1],
+ 'changetype' : 'add'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_mod_del_add_multi_2
+ #@TestID double_mod_del_add_multi_2
+ #@TestPurpose Double replace (del+add) any value with same
+ value of a multi-valued attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with
+ description:{1 2 3 4 5 6 7 8 9 10}
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: del description=1 + add description=11
+ #@TestSteps server2: del description=10 + add description=11
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description={2 3 4 5 6 7 8 9 11}
+ on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_005" scope="local">
+ <testcase name="getTestCaseName('double_mod_del_add_multi_2')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_mod_del_add_multi_2. \
+ Double replace (del+add) any value with same value of a \
+ multi-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=A3')
+ for x in range(10):
+ myEntry.addAttr('description', '%i' % (x+1))
+ server1del = ['description:1']
+ server1add = ['description:11']
+ server2del = ['description:10']
+ server2add = ['description:11']
+ server1mods = [server1del, server1add]
+ server2mods = [server2del, server2add]
+ mods = [server1mods, server2mods]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : 'delete'
+ }
+ </call>
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][1],
+ 'changetype' : 'add'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_mod_add_multi
+ #@TestID double_mod_add_multi
+ #@TestPurpose Double mod_add a multi-valued attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: add description=1
+ #@TestSteps server2: add description={1 2}
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description={1 2} on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_006" scope="local">
+ <testcase name="getTestCaseName('double_mod_add_multi')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_mod_add_multi. \
+ Double mod_add a multi-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=B1')
+ server1add = ['description:1']
+ server2add = ['description:1', 'description:2']
+ server1mods = [server1add]
+ server2mods = [server2add]
+ mods = [server1mods, server2mods]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : 'add'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_mod_add_single
+ #@TestID double_mod_add_single
+ #@TestPurpose Double mod_add a single-valued attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: add employeeNumber=1
+ #@TestSteps server2: add employeeNumber=2
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check employeeNumber=1 on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_007" scope="local">
+ <testcase name="getTestCaseName('double_mod_add_single')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_mod_add_single. \
+ Double mod_add a single-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=B2')
+ server1add = ['employeeNumber:1']
+ server2add = ['employeeNumber:2']
+ server1mods = [server1add]
+ server2mods = [server2add]
+ mods = [server1mods, server2mods]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : 'add'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'employeeNumber',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'employeeNumber',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_mod_del_multi
+ #@TestID double_mod_del_multi
+ #@TestPurpose Double mod_delete a multi-valued attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with
+ description:{1 2 3 4 5 6 7 8 9 10}
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: delete description={1 2 3 4 5}
+ #@TestSteps server2: delete description={4 5 6 7 8}
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description={9 10} on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_008" scope="local">
+ <testcase name="getTestCaseName('double_mod_del_multi')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_mod_del_multi. \
+ Double mod_delete a multi-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=C1')
+ for x in range(10):
+ myEntry.addAttr('description', '%i' % (x+1))
+ server1del = []
+ for y in range(1,6):
+ server1del.append('description:%i' % y)
+ server2del = []
+ for z in range(4,9):
+ server2del.append('description:%i' % z)
+ server1mods = [server1del]
+ server2mods = [server2del]
+ mods = [server1mods, server2mods]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : 'delete'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_mod_del_single
+ #@TestID double_mod_del_single
+ #@TestPurpose Double mod_delete a single-valued attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with employeeNumber=1
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: delete employeeNumber
+ #@TestSteps server2: delete employeeNumber=1
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check employeeNumber no longer exists on either
+ server
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_009" scope="local">
+ <testcase name="getTestCaseName('double_mod_del_single')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_mod_del_single. \
+ Double mod_delete a single-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=C2')
+ myEntry.addAttr('employeeNumber', '1')
+ server1del = ['employeeNumber:']
+ server2del = ['employeeNumber:1']
+ server1mods = [server1del]
+ server2mods = [server2del]
+ mods = [server1mods, server2mods]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : 'delete'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'employeeNumber',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'employeeNumber',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict:
+ mod_del_add_vs_mod_add_del_multi
+ #@TestID mod_del_add_vs_mod_add_del_multi
+ #@TestPurpose Modify: Delete+Add then Add+Delete on 2
+ multi-valued attributes
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with
+ description=1 , telephoneNumber=1
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: add description=2 ,
+ delete telephoneNumber
+ #@TestSteps server2: delete description ,
+ add telephoneNumber=2
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description no longer exists and
+ telephoneNumber=2 on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_010" scope="local">
+ <testcase name="getTestCaseName('mod_del_add_vs_mod_add_del_multi')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: mod_del_add_vs_mod_add_del_multi. \
+ Modify: Delete+Add then Add+Delete on 2 multi-valued attributes'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=D1')
+ myEntry.addAttr('description', '1')
+ myEntry.addAttr('telephoneNumber', '1')
+ server1add = ['description:2']
+ server1del = ['telephoneNumber:']
+ server2del = ['description:']
+ server2add = ['telephoneNumber:2']
+ server1mods = [server1add, server1del]
+ server2mods = [server2del, server2add]
+ mods = [server1mods, server2mods]
+ server1changetypes = ['add', 'delete']
+ server2changetypes = ['delete', 'add']
+ changetypes = [server1changetypes, server2changetypes]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : changetypes[i][0]
+ }
+ </call>
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][1],
+ 'changetype' : changetypes[i][1]
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description telephoneNumber',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description telephoneNumber',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict:
+ mod_add_vs_mod_replace_multi
+ #@TestID mod_add_vs_mod_replace_multi
+ #@TestPurpose mod_add vs mod_replace on a multi-valued
+ attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with description=1
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: add description={2 3}
+ #@TestSteps server2: replace description -> {4 5}
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description={4 5} on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_011" scope="local">
+ <testcase name="getTestCaseName('mod_add_vs_mod_replace_multi')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: mod_add_vs_mod_replace_multi. \
+ mod_add vs mod_replace on a multi-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=E1')
+ myEntry.addAttr('description', '1')
+ server1add = ['description:2', 'description:3']
+ server2replace = ['description:4', 'description:5']
+ server1mods = [server1add]
+ server2mods = [server2replace]
+ mods = [server1mods, server2mods]
+ server1changetypes = ['add']
+ server2changetypes = ['replace']
+ changetypes = [server1changetypes, server2changetypes]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : changetypes[i][0]
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict:
+ mod_replace_vs_mod_add_multi
+ #@TestID mod_replace_vs_mod_add_multi
+ #@TestPurpose mod_replace vs mod_add on a multi-valued
+ attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with description=1
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: replace description -> {2 3}
+ #@TestSteps server2: add description={4 5}
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description={2 3 4 5} on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_012" scope="local">
+ <testcase name="getTestCaseName('mod_replace_vs_mod_add_multi')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: mod_replace_vs_mod_add_multi. \
+ mod_replace vs mod_add on a multi-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=E2')
+ myEntry.addAttr('description', '1')
+ server1replace = ['description:2', 'description:3']
+ server2add = ['description:4', 'description:5']
+ server1mods = [server1replace]
+ server2mods = [server2add]
+ mods = [server1mods, server2mods]
+ server1changetypes = ['replace']
+ server2changetypes = ['add']
+ changetypes = [server1changetypes, server2changetypes]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : changetypes[i][0]
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict:
+ mod_del_vs_mod_replace_multi
+ #@TestID mod_del_vs_mod_replace_multi
+ #@TestPurpose mod_del vs mod_replace on a multi-valued
+ attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with
+ description={1 2 3 4}
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: delete description={2 3}
+ #@TestSteps server2: replace description -> {6 7 8 9 10}
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description={6 7 8 9 10} on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_013" scope="local">
+ <testcase name="getTestCaseName('mod_del_vs_mod_replace_multi')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: mod_del_vs_mod_replace_multi. \
+ mod_del vs mod_replace on a multi-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=F1')
+ for x in range(4):
+ myEntry.addAttr('description', '%i' % (x+1))
+ server1del = ['description:2', 'description:3']
+ server2replace = []
+ for y in range(6,11):
+ server2replace.append('description:%i' % y)
+ server1mods = [server1del]
+ server2mods = [server2replace]
+ mods = [server1mods, server2mods]
+ server1changetypes = ['delete']
+ server2changetypes = ['replace']
+ changetypes = [server1changetypes, server2changetypes]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : changetypes[i][0]
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict:
+ mod_replace_vs_mod_del_multi
+ #@TestID mod_replace_vs_mod_del_multi
+ #@TestPurpose mod_replace vs mod_del on a multi-valued
+ attribute
+ #@TestPreamble
+ #@TestSteps Add entry to server1 with
+ description={1 2 3 4}
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: replace description -> {1 2 3}
+ #@TestSteps server2: delete description={3 4}
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check description={1 2} on both servers
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_014" scope="local">
+ <testcase name="getTestCaseName('mod_replace_vs_mod_del_multi')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: mod_replace_vs_mod_del_multi. \
+ mod_replace vs mod_del on a multi-valued attribute'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ myEntry = Entry('cn=F2')
+ for x in range(4):
+ myEntry.addAttr('description', '%i' % (x+1))
+ server1replace = ['description:1', 'description:2',
+ 'description:3']
+ server2del = ['description:3', 'description:4']
+ server1mods = [server1replace]
+ server2mods = [server2del]
+ mods = [server1mods, server2mods]
+ server1changetypes = ['replace']
+ server2changetypes = ['delete']
+ changetypes = [server1changetypes, server2changetypes]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : myEntry.getDn(),
+ 'listAttributes' : mods[i][0],
+ 'changetype' : changetypes[i][0]
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
+ <!-- Delete added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [myEntry.getDn()]
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: add_child_del_parent
+ #@TestID add_child_del_parent
+ #@TestPurpose Add a child vs delete his parent
+ #@TestPreamble
+ #@TestSteps Add entry cn=P1 to server1
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server2: add child cn=C1,cn=P1
+ #@TestSteps server1: delete parent cn=P1
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check servers are synchronised
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_015" scope="local">
+ <testcase name="getTestCaseName('add_child_del_parent')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: add_child_del_parent. \
+ Add a child vs delete his parent'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ parentEntry = Entry('cn=P1')
+ parentEntry.addAttr('givenname', 'DUMMY ENTRY')
+ childEntry = Entry('cn=C1,cn=P1')
+ childEntry.addAttr('givenname', 'DUMMY ENTRY')
+ # addedEntries = [[], []]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : parentEntry.getDn(),
+ 'listAttributes' : parentEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Add child entry on server2 -->
+ <call function="'addAnEntry'">
+ { 'location' : server2Host,
+ 'dsPath' : server2Path,
+ 'dsInstanceHost' : server2Host,
+ 'dsInstancePort' : server2.getPort(),
+ 'dsInstanceDn' : server2.getRootDn(),
+ 'dsInstancePswd' : server2.getRootPwd(),
+ 'DNToAdd' : childEntry.getDn(),
+ 'listAttributes' : childEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Delete parent entry on server1-->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [parentEntry.getDn()]
+ }
+ </call>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'givenname=DUMMY ENTRY',
+ 'dsAttributes' : 'ds-sync-conflict cn',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : 'cn=monitor',
+ 'dsFilter' : monitorFilter,
+ 'dsAttributes' : monitorCounters,
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'givenname=DUMMY ENTRY',
+ 'dsAttributes' : 'ds-sync-conflict cn',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ <script>
+ resultDnList = []
+ for line in searchResult.splitlines():
+ if line.find('dn: ') != -1:
+ resultDn = line[len('dn: '):]
+ resultDnList.append(resultDn)
+ addedEntries[i] = resultDnList
+ </script>
+ </sequence>
+ <else>
+ <script>
+ addedEntries[i] = []
+ </script>
+ </else>
+ </if>
+
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : 'cn=monitor',
+ 'dsFilter' : monitorFilter,
+ 'dsAttributes' : monitorCounters,
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <!-- If the trees don't match, we may have come across Issue 3891
+ (Replication conflict: add child , delete parent) -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix,
+ '3891' ]
+ </call>
+
+ <!-- Delete added entries -->
+ <script>
+ list1 = addedEntries[0]
+ list2 = addedEntries[1]
+ toRemove = []
+ # remove potential redundancies, to avoid deleting them twice
+ for addedEntry in list2:
+ if addedEntry in list1:
+ toRemove.append(addedEntry)
+ for ent in toRemove:
+ list2.remove(ent)
+ </script>
+ <paralleliterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <if expr="len(addedEntries[i]) != 0">
+ <paralleliterate var="entryToDelete" in="addedEntries[i]">
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsDn' : [entryToDelete]
+ }
+ </call>
+ </paralleliterate>
+ </if>
+ </paralleliterate>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: del_parent_add_child
+ #@TestID del_parent_add_child
+ #@TestPurpose Delete a parent vs add his child
+ #@TestPreamble
+ #@TestSteps Add entry cn=P2 to server1
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: delete parent cn=P2
+ #@TestSteps server2: add child cn=C2,cn=P2
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check servers are synchronised
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_016" scope="local">
+ <testcase name="getTestCaseName('del_parent_add_child')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: del_parent_add_child. \
+ Delete a parent vs add his child'
+ </message>
+
+ <!-- Add entry to server1 -->
+ <script>
+ parentEntry = Entry('cn=P2')
+ parentEntry.addAttr('givenname', 'DUMMY ENTRY')
+ childEntry = Entry('cn=C2,cn=P2')
+ childEntry.addAttr('givenname', 'DUMMY ENTRY')
+ # addedEntries = [[], []]
+ </script>
+ <call function="'addAnEntry'">
+ { 'location' : server1Host,
+ 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : parentEntry.getDn(),
+ 'listAttributes' : parentEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Delete parent entry on server1-->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [parentEntry.getDn()]
+ }
+ </call>
+
+ <!-- Add child entry on server2 -->
+ <call function="'addAnEntry'">
+ { 'location' : server2Host,
+ 'dsPath' : server2Path,
+ 'dsInstanceHost' : server2Host,
+ 'dsInstancePort' : server2.getPort(),
+ 'dsInstanceDn' : server2.getRootDn(),
+ 'dsInstancePswd' : server2.getRootPwd(),
+ 'DNToAdd' : childEntry.getDn(),
+ 'listAttributes' : childEntry.getAttrList()
+ }
+ </call>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'givenname=DUMMY ENTRY',
+ 'dsAttributes' : 'ds-sync-conflict cn',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : 'cn=monitor',
+ 'dsFilter' : monitorFilter,
+ 'dsAttributes' : monitorCounters,
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'givenname=DUMMY ENTRY',
+ 'dsAttributes' : 'ds-sync-conflict cn',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ <script>
+ resultDnList = []
+ for line in searchResult.splitlines():
+ if line.find('dn: ') != -1:
+ resultDn = line[len('dn: '):]
+ resultDnList.append(resultDn)
+ addedEntries[i] = resultDnList
+ </script>
+ </sequence>
+ <else>
+ <script>
+ addedEntries[i] = []
+ </script>
+ </else>
+ </if>
+
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : 'cn=monitor',
+ 'dsFilter' : monitorFilter,
+ 'dsAttributes' : monitorCounters,
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <!-- If the trees don't match, we may have come across Issue 4071
+ (Replication conflict: delete parent, add child) -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix,
+ '4071' ]
+ </call>
+
+ <!-- Delete added entries -->
+ <script>
+ list1 = addedEntries[0]
+ list2 = addedEntries[1]
+ toRemove = []
+ # remove potential redundancies, to avoid deleting them twice
+ for addedEntry in list2:
+ if addedEntry in list1:
+ toRemove.append(addedEntry)
+ for ent in toRemove:
+ list2.remove(ent)
+ </script>
+ <paralleliterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <if expr="len(addedEntries[i]) != 0">
+ <paralleliterate var="entryToDelete" in="addedEntries[i]">
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsDn' : [entryToDelete]
+ }
+ </call>
+ </paralleliterate>
+ </if>
+ </paralleliterate>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_add
+ #@TestID double_add
+ #@TestPurpose Double add (same dn, different uid)
+ #@TestPreamble
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: add entry cn=F with uid=1
+ #@TestSteps server2: add entry cn=F with uid=2
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps Check servers are synchronised
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_017" scope="local">
+ <testcase name="getTestCaseName('double_add')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_add. \
+ Double add (same dn, different uid)'
+ </message>
+
+ <script>
+ entry1 = Entry('cn=F')
+ entry1.addAttr('uid', '1')
+ entry1.addAttr('givenname', 'DUMMY ENTRY')
+ entry2 = Entry('cn=F')
+ entry2.addAttr('uid', '2')
+ entry2.addAttr('givenname', 'DUMMY ENTRY')
+
+ entriesToAdd = [entry1, entry2]
+ </script>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Add entry on one of the servers -->
+ <call function="'addAnEntry'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToAdd' : entriesToAdd[i].getDn(),
+ 'listAttributes' : entriesToAdd[i].getAttrList()
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'givenname=DUMMY ENTRY',
+ 'dsAttributes' : 'ds-sync-conflict uid cn',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : 'cn=monitor',
+ 'dsFilter' : monitorFilter,
+ 'dsAttributes' : monitorCounters,
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'givenname=DUMMY ENTRY',
+ 'dsAttributes' : 'ds-sync-conflict uid cn',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ <script>
+ resultDnList = []
+ for line in searchResult.splitlines():
+ if line.find('dn: ') != -1:
+ resultDn = line[len('dn: '):]
+ resultDnList.append(resultDn)
+ addedEntries[i] = resultDnList
+ </script>
+ </sequence>
+ <else>
+ <script>
+ addedEntries[i] = []
+ </script>
+ </else>
+ </if>
+
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : 'cn=monitor',
+ 'dsFilter' : monitorFilter,
+ 'dsAttributes' : monitorCounters,
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <!-- If the trees don't match, we may have come across Issue OPENDJ-454
+ (RFE: Solve naming conflict of 2 adds with same dn, different
+ attr value) -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix,
+ 'OPENDJ-454' ]
+ </call>
+
+ <!-- Delete added entries -->
+ <script>
+ list1 = addedEntries[0]
+ list2 = addedEntries[1]
+ toRemove = []
+ # remove potential redundancies, to avoid deleting them twice
+ for addedEntry in list2:
+ if addedEntry in list1:
+ toRemove.append(addedEntry)
+ for ent in toRemove:
+ list2.remove(ent)
+ </script>
+ <paralleliterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <if expr="len(addedEntries[i]) != 0">
+ <paralleliterate var="entryToDelete" in="addedEntries[i]">
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsDn' : [entryToDelete]
+ }
+ </call>
+ </paralleliterate>
+ </if>
+ </paralleliterate>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Conflict Tests
+ #@TestName Replication: Conflict: double_add_single_del_1
+ #@TestID double_add_single_del_1
+ #@TestPurpose Add twice same dn, then delete it in one server
+ #@TestPreamble
+ #@TestSteps Disconnect Replication Servers
+ #@TestSteps server1: add entry cn=DN1 with uid=1
+ #@TestSteps server2: add entry cn=DN1 with uid=2
+ #@TestSteps Re-connect Replication Servers
+ #@TestSteps server1: delete entry cn=DN1
+ #@TestSteps Check servers are synchronised
+ #@TestPostamble
+ #@TestResult Success if trees are synchronised
+ -->
+ <function name="replication_conflict_018" scope="local">
+ <testcase name="getTestCaseName('double_add_single_del_1')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: Conflict: double_add_single_del_1. \
+ Add twice same dn, then delete it in one server'
+ </message>
+
+ <script>
+ entry1 = Entry('cn=DN1')
+ entry1.addAttr('uid', '1')
+ entry1.addAttr('givenname', 'DUMMY ENTRY')
+ entry2 = Entry('cn=DN1')
+ entry2.addAttr('uid', '2')
+ entry2.addAttr('givenname', 'DUMMY ENTRY')
+
+ entriesToAdd = [entry1, entry2]
+ </script>
+
+ <!-- Disconnect Replication Servers -->
+ <call function="'disconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <iterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <!-- Add entry on one of the servers -->
+ <call function="'addAnEntry'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToAdd' : entriesToAdd[i].getDn(),
+ 'listAttributes' : entriesToAdd[i].getAttrList()
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Check modifies have not been propagated -->
+ <paralleliterate var="server" in="[server1, server2]">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'givenname=DUMMY ENTRY',
+ 'dsAttributes' : 'ds-sync-conflict uid cn',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : 'cn=monitor',
+ 'dsFilter' : monitorFilter,
+ 'dsAttributes' : monitorCounters,
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Reconnect Replication Servers -->
+ <call function="'reconnectReplicationServers'">
+ [ clientHost, clientPath, [replServer1, replServer2] ]
+ </call>
+
+ <!-- Delete entry on server1-->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1Host,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'dsDn' : [entry1.getDn()]
+ }
+ </call>
+
+ <!-- Check conflict is resolved -->
+ <paralleliterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <sequence>
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : synchroSuffix,
+ 'dsFilter' : 'givenname=DUMMY ENTRY',
+ 'dsAttributes' : 'ds-sync-conflict uid cn',
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ <script>
+ resultDnList = []
+ for line in searchResult.splitlines():
+ if line.find('dn: ') != -1:
+ resultDn = line[len('dn: '):]
+ resultDnList.append(resultDn)
+ addedEntries[i] = resultDnList
+ </script>
+ </sequence>
+ <else>
+ <script>
+ addedEntries[i] = []
+ </script>
+ </else>
+ </if>
+
+ <call function="'ldapSearchWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' \
+ % (server.getDir(), OPENDSNAME),
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsBaseDN' : 'cn=monitor',
+ 'dsFilter' : monitorFilter,
+ 'dsAttributes' : monitorCounters,
+ 'logStderr' : False
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <if expr="resultLength != 0">
+ <sequence>
+ <message>
+ '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
+ % (server.getHostname(), server.getPort(), searchResult)
+ </message>
+ </sequence>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <!-- If the trees don't match, we may have come across Issue OPENDJ-454
+ (RFE: Solve naming conflict of 2 adds with same dn, different
+ attr value) -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix,
+ 'OPENDJ-454' ]
+ </call>
+
+ <!-- Delete added entries -->
+ <script>
+ list1 = addedEntries[0]
+ list2 = addedEntries[1]
+ toRemove = []
+ # remove potential redundancies, to avoid deleting them twice
+ for addedEntry in list2:
+ if addedEntry in list1:
+ toRemove.append(addedEntry)
+ for ent in toRemove:
+ list2.remove(ent)
+ </script>
+ <paralleliterate var="server"
+ in="[server1, server2]"
+ indexvar="i">
+ <if expr="len(addedEntries[i]) != 0">
+ <paralleliterate var="entryToDelete" in="addedEntries[i]">
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'dsDn' : [entryToDelete]
+ }
+ </call>
+ </paralleliterate>
+ </if>
+ </paralleliterate>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml
index ef5b0ea..4c7c348 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml
@@ -7,953 +7,154 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2007-2010 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
-
<defaultcall function="replication_encryption"/>
-
- <function name="replication_encryption">
-
+ <function name="replication_encryption" scope="local">
<sequence>
-
- <block name="'encryption'">
-
- <sequence>
-
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication Encryption Tests
- #@TestSuitePurpose Verify that replication can use an encrypted
- channel.
- #@TestSuiteID Encryption Tests
- #@TestSuiteGroup Encryption
- #@TestGroup Replication
- #@TestScript replication_encryption.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'">
- { 'topologyFile' : '%s/3server_topology.txt' \
- % REPLICATION_CONFIG_DIR,
- 'secureReplication': True,
- 'dataFile' : 'Example.ldif',
- 'label' : 'Replication Encryption'
- }
- </call>
-
- <script>
- consumer = consumerList[0]
- </script>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Add entry
- #@TestID Add entry
- #@TestPurpose Check entry add over secured replication
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName('Add entry')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Add entry. Check entry add over \
- secured replication'
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
- </script>
-
- <!-- Add entry to one of the other servers -->
- <script>
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen-%s' % i)
- listAttr.append('sn:Abizen-%s' % i)
- listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
- listAttr.append('l:ICNC')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr
- }
- </call>
+ <block name="'replication_encryption'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'encryption'
- </sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication Encryption'
+ </script>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Add entry after restart
- #@TestID Add entry after restart
- #@TestPurpose Check entry add over secured replication after
- server restart
- #@TestPreamble
- #@TestSteps Restart servers
- #@TestSteps Add entry
- #@TestPostamble
- #@TestResult Success if trees synchronised over the topology
- -->
- <testcase name="getTestCaseName('Add entry after restart')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Add entry after restart. \
- Check entry add over secured replication after server restart'
- </message>
-
- <!-- Stop the servers in the topology -->
- <call function="'stopServers'">
- [_splitServerList]
- </call>
-
- <!-- Start the servers in the topology -->
- <call function="'startServers'">
- [_splitServerList]
- </call>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- userDn = 'uid=RESTART-iabizen-%s, ou=People, %s' % \
- (i,synchroSuffix)
- </script>
-
- <!-- Add entry to one of the other servers -->
- <script>
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen-%s' % i)
- listAttr.append('sn:Abizen-%s' % i)
- listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
- listAttr.append('l:ICNC')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr
- }
- </call>
-
- </sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Modify entry
- #@TestID Modify entry
- #@TestPurpose Check entry modify over secured replication
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName('Modify entry')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Modify entry. Check entry modify \
- over secured replication'
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
- </script>
-
- <!-- Modify entry on one of the servers -->
- <call function="'modifyAnAttribute'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'DNToModify' : userDn,
- 'attributeName' : 'l',
- 'newAttributeValue' : 'GEC',
- 'changetype' : 'replace'
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix, ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Delete entry
- #@TestID Delete entry
- #@TestPurpose Check entry delete over secured replication
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName('Delete entry')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Delete entry. Check delete modify \
- over secured replication'
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
- </script>
-
- <!-- Delete entry on one of the servers -->
- <call function="'DeleteEntry'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort() ,
- 'dsInstanceDn' : server.getRootDn() ,
- 'dsInstancePswd' : server.getRootPwd() ,
- 'dsBaseDN' : userDn
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Modify Entry - add
- binary attribute
- #@TestID Modify Entry - add binary attribute
- #@TestPurpose Check that an entry modify is well propagated
- by secured replication.
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - add binary attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Modify Entry - add binary attribute. \
- Check that an entry modify is well propagated by secured \
- replication.'
- </message>
-
- <script>
- filename = 'replication_mod_add_binary.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- binaryFilePath = '%s/replication/photo1.uu' % source.data
- dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
- modif = 'add'
- attrType = 'jpegPhoto'
- write_replication_mod_binary_ldif_file(filePath, dn, modif,
- attrType, binaryFilePath)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' % (filename,local.temp,
- client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname() }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'jpegPhoto=*',
- 'expectedRC' : 0
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Modify Entry -
- replace binary attribute
- #@TestID Modify Entry - replace binary attribute
- #@TestPurpose Check that an entry modify is well propagated
- by secured replication.
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - replace binary attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Modify Entry - replace binary \
- attribute. \
- Check that an entry modify is well propagated by secured \
- replication.'
- </message>
-
- <script>
- filename = 'replication_mod_replace_binary.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- binaryFilePath = '%s/replication/photo2.uu' % source.data
- dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
- modif = 'replace'
- attrType = 'jpegPhoto'
- write_replication_mod_binary_ldif_file(filePath, dn, modif,
- attrType,
- binaryFilePath)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' % (filename,local.temp,
- client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'jpegPhoto=*',
- 'expectedRC' : 0
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Modify Entry -
- delete binary attribute
- #@TestID Modify Entry - delete binary attribute
- #@TestPurpose Check that an entry modify is well propagated
- by secured replication.
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName
- ('Modify Entry - delete binary attribute')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Modify Entry - delete binary \
- attribute. \
- Check that an entry modify is well propagated by secured \
- replication.'
- </message>
-
-
- <script>
- filename = 'replication_mod_delete_binary.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
- modif = 'delete'
- attrType = 'jpegPhoto'
- attrValue = None
- write_replication_mod_ldif_file(filePath, dn, modif, attrType,
- attrValue)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' % (filename,local.temp,
- client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname() }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
- <!-- Check modify worked on "master" server -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'jpegPhoto=*',
- 'expectedRC' : 0
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 0
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix, ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Rename Entry
- #@TestID Rename Entry
- #@TestPurpose Check that a rename (modrdn) operation is well
- propagated by secured replication.
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName('Rename Entry')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Rename Entry. Check that a rename \
- (modrdn) operation is well propagated by secured replication.'
- </message>
-
- <script>
- filename = 'replication_modrdn.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix
- newrdn = 'uid=kvaughan2'
- newsuperior = None
- deleteoldrdn = 1
- write_replication_moddn_ldif_file(filePath, dn, newrdn,
- newsuperior, deleteoldrdn)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' % (filename,local.temp,
- client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}"
- does NOT exist anymore -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=kvaughan, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'objectclass=*',
- 'expectedRC' : 32
- }
- </call>
-
- <!-- check that new entry "uid=kvaughan2, ou=People,
- ${DIRECTORY_BASE}" exists -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=kvaughan2, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'objectclass=*'
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Rename Entry
- (preserving old rdn)
- #@TestID Rename Entry (preserving old rdn)
- #@TestPurpose Check that a rename (modrdn) operation is well
- propagated by secured replication.
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName
- ('Rename Entry (preserving old rdn)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Rename Entry (preserving old rdn). \
- Check that a rename (modrdn) operation is well propagated by \
- secured replication.'
- </message>
-
- <script>
- filename = 'replication_modrdn_preserve.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- dn = 'uid=jwallace, ou=People,%s' % synchroSuffix
- newrdn = 'uid=igueye'
- newsuperior = None
- deleteoldrdn = 0
- write_replication_moddn_ldif_file(filePath, dn, newrdn,
- newsuperior, deleteoldrdn)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' % (filename,local.temp,
- client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname()
- }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}"
- does NOT exist anymore -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'objectclass=*',
- 'expectedRC' : 32
- }
- </call>
-
- <!-- check that new entry "uid=igueye, ou=People,
- ${DIRECTORY_BASE}" exists -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=igueye, ou=People,%s' % synchroSuffix,
- 'dsFilter' : 'uid=jwallace'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <call function="'checktestRC'">
- { 'returncode' : resultLength ,
- 'result' : searchResult ,
- 'expected' : 1
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Encryption Tests
- #@TestName Replication: Encryption: Rename Subtree
- #@TestID Rename Subtree
- #@TestPurpose Check that a subtree rename (moddn) operation
- is well propagated by secured replication.
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName('Rename Subtree')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Encryption: Rename Subtree. Check that a \
- subtree rename (moddn) operation is well propagated by \
- secured replication.'
- </message>
-
- <script>
- filename = 'replication_moddn.ldif'
- filePath = '%s/%s' % (local.temp,filename)
- dn = 'ou=People,%s' % synchroSuffix
- newrdn = 'ou=Special People'
- newsuperior = 'ou=Special Users,%s' % synchroSuffix
- deleteoldrdn = 0
- write_replication_moddn_ldif_file(filePath, dn, newrdn,
- newsuperior, deleteoldrdn)
- </script>
-
- <!-- Copy the replication_mod ldif to client host -->
- <message>
- 'Copy %s file from %s to %s' % (filename,local.temp,
- client.getTmpDir())
- </message>
- <call function="'copyFile'">
- { 'srcfile' : filePath,
- 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
- 'remotehost' : client.getHostname() }
- </call>
-
- <!-- Modify "master" server -->
- <call function="'ldapModifyWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
- }
- </call>
-
-
- <!-- Check modify worked on "master" server -->
- <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}"
- does NOT exist anymore -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=gfarmer, ou=People,%s' \
- % synchroSuffix,
- 'dsFilter' : 'objectclass=*',
- 'expectedRC' : 32
- }
- </call>
-
- <!-- check that new entry "uid=gfarmer, ou=Special People,
- ou=Special Users, ${DIRECTORY_BASE}" exists -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'dsBaseDN' : 'uid=gfarmer, ou=Special People, \
- ou=Special Users,%s' % synchroSuffix,
- 'dsFilter' : 'objectclass=*'
- }
- </call>
-
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication Encryption' }
- </call>
-
- <call function="'testSuite_Postamble'"/>
+ <!--- Test Suite information
+ #@TestSuiteName Replication Encryption Tests
+ #@TestSuitePurpose Verify that the encrypted operations are replicated
+ correctly between two servers.
+ #@TestSuiteID Encryption Tests
+ #@TestSuiteGroup Encryption
+ #@TestGroup Replication
+ #@TestScript replication_encryption.xml
+ #@TestHTMLLink http://www.forgerock.org/
+ -->
- </sequence>
+ <call function="'testSuite_Preamble'"/>
+ <try>
+ <sequence>
+
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'">
+ { 'topologyFile' : '%s/3server_topology.txt' \
+ % REPLICATION_CONFIG_DIR,
+ 'secureReplication': True,
+ 'dataFile' : 'Example.ldif',
+ 'label' : 'Replication Encryption'
+ }
+ </call>
+
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('encryption/encryption_tests')
+ </script>
+
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
+
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: Encryption:'
+ consumer = consumerList[0]
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_encryption_001')
+ testsList.append('replication_encryption_002')
+ testsList.append('replication_encryption_003')
+ testsList.append('replication_encryption_004')
+ testsList.append('replication_encryption_005')
+ testsList.append('replication_encryption_006')
+ testsList.append('replication_encryption_007')
+ testsList.append('replication_encryption_008')
+ testsList.append('replication_encryption_009')
+ testsList.append('replication_encryption_010')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ <catch exception="'STAFException.TestSuite.SetupException'">
+ <sequence>
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
+ </message>
+ <rethrow/>
+ </sequence>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
+
+ </try>
+
+ </sequence>
+
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </finally>
+
+ </try>
</block>
-
</sequence>
-
</function>
-
</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption_tests.xml
new file mode 100644
index 0000000..f822bd7
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption_tests.xml
@@ -0,0 +1,1088 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2007-2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Add entry
+ #@TestID Add entry
+ #@TestPurpose Check entry add over secured replication
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_encryption_001" scope="local">
+ <testcase name="getTestCaseName('Add entry')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check entry add over secured replication.' % msg1 }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
+ </script>
+
+ <!-- Add entry to one of the other servers -->
+ <script>
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen-%s' % i)
+ listAttr.append('sn:Abizen-%s' % i)
+ listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
+ listAttr.append('l:ICNC')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr
+ }
+ </call>
+
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Add entry after restart
+ #@TestID Add entry after restart
+ #@TestPurpose Check entry add over secured replication after
+ server restart
+ #@TestPreamble
+ #@TestSteps Restart servers
+ #@TestSteps Add entry
+ #@TestPostamble
+ #@TestResult Success if trees synchronised over the topology
+ -->
+ <function name="replication_encryption_002" scope="local">
+ <testcase name="getTestCaseName('Add entry after restart')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check entry add over secured replication after server restart.' % msg1 }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <call function="'stopServers'">
+ [_splitServerList]
+ </call>
+
+ <!-- Start the servers in the topology -->
+ <call function="'startServers'">
+ [_splitServerList]
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ userDn = 'uid=RESTART-iabizen-%s, ou=People, %s' % \
+ (i,synchroSuffix)
+ </script>
+
+ <!-- Add entry to one of the other servers -->
+ <script>
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen-%s' % i)
+ listAttr.append('sn:Abizen-%s' % i)
+ listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
+ listAttr.append('l:ICNC')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr
+ }
+ </call>
+
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Modify entry
+ #@TestID Modify entry
+ #@TestPurpose Check entry modify over secured replication
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_encryption_003" scope="local">
+ <testcase name="getTestCaseName('Modify entry')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check entry modify secured replication.' % msg1 }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
+ </script>
+
+ <!-- Modify entry on one of the servers -->
+ <call function="'modifyAnAttribute'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'DNToModify' : userDn,
+ 'attributeName' : 'l',
+ 'newAttributeValue' : 'GEC',
+ 'changetype' : 'replace'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix, ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Delete entry
+ #@TestID Delete entry
+ #@TestPurpose Check entry delete over secured replication
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_encryption_004" scope="local">
+ <testcase name="getTestCaseName('Delete entry')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check delete entry secured replication.' % msg1 }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
+ </script>
+
+ <!-- Delete entry on one of the servers -->
+ <call function="'DeleteEntry'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort() ,
+ 'dsInstanceDn' : server.getRootDn() ,
+ 'dsInstancePswd' : server.getRootPwd() ,
+ 'dsBaseDN' : userDn
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Modify Entry - add
+ binary attribute
+ #@TestID Modify Entry - add binary attribute
+ #@TestPurpose Check that an entry modify is well propagated
+ by secured replication.
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_encryption_005" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - add binary attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that an entry modify is well propagated by secured replication.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_mod_add_binary.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ binaryFilePath = '%s/replication/photo1.uu' % source.data
+ dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
+ modif = 'add'
+ attrType = 'jpegPhoto'
+ write_replication_mod_binary_ldif_file(filePath, dn, modif,
+ attrType, binaryFilePath)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' % (filename,local.temp,
+ client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'jpegPhoto=*',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Modify Entry -
+ replace binary attribute
+ #@TestID Modify Entry - replace binary attribute
+ #@TestPurpose Check that an entry modify is well propagated
+ by secured replication.
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_encryption_006" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - replace binary attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that an entry modify is well propagated by secured replication.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_mod_replace_binary.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ binaryFilePath = '%s/replication/photo2.uu' % source.data
+ dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
+ modif = 'replace'
+ attrType = 'jpegPhoto'
+ write_replication_mod_binary_ldif_file(filePath, dn, modif,
+ attrType,
+ binaryFilePath)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' % (filename,local.temp,
+ client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'jpegPhoto=*',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Modify Entry -
+ delete binary attribute
+ #@TestID Modify Entry - delete binary attribute
+ #@TestPurpose Check that an entry modify is well propagated
+ by secured replication.
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_encryption_007" scope="local">
+ <testcase name="getTestCaseName('Modify Entry - delete binary attribute')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that an entry modify is well propagated by secured secured replication.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_mod_delete_binary.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ dn = 'uid=hmiller, ou=People,%s' % synchroSuffix
+ modif = 'delete'
+ attrType = 'jpegPhoto'
+ attrValue = None
+ write_replication_mod_ldif_file(filePath, dn, modif, attrType,
+ attrValue)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' % (filename,local.temp,
+ client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=hmiller, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'jpegPhoto=*',
+ 'expectedRC' : 0
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 0
+ }
+ </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix, ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Rename Entry
+ #@TestID Rename Entry
+ #@TestPurpose Check that a rename (modrdn) operation is well
+ propagated by secured replication.
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_encryption_008" scope="local">
+ <testcase name="getTestCaseName('Rename Entry')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%sCheck that a rename entry (modrdn) operation is well propagated by secured replication.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_modrdn.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix
+ newrdn = 'uid=kvaughan2'
+ newsuperior = None
+ deleteoldrdn = 1
+ write_replication_moddn_ldif_file(filePath, dn, newrdn,
+ newsuperior, deleteoldrdn)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' % (filename,local.temp,
+ client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}"
+ does NOT exist anymore -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=kvaughan, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'objectclass=*',
+ 'expectedRC' : 32
+ }
+ </call>
+
+ <!-- check that new entry "uid=kvaughan2, ou=People,
+ ${DIRECTORY_BASE}" exists -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=kvaughan2, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'objectclass=*'
+ }
+ </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Rename Entry
+ (preserving old rdn)
+ #@TestID Rename Entry (preserving old rdn)
+ #@TestPurpose Check that a rename (modrdn) operation is well
+ propagated by secured replication.
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_encryption_009" scope="local">
+ <testcase name="getTestCaseName('Rename Entry (preserving old rdn)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a rename (modrdn) operation is well propagated by secured replication.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_modrdn_preserve.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ dn = 'uid=jwallace, ou=People,%s' % synchroSuffix
+ newrdn = 'uid=igueye'
+ newsuperior = None
+ deleteoldrdn = 0
+ write_replication_moddn_ldif_file(filePath, dn, newrdn,
+ newsuperior, deleteoldrdn)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' % (filename,local.temp,
+ client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname()
+ }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}"
+ does NOT exist anymore -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'objectclass=*',
+ 'expectedRC' : 32
+ }
+ </call>
+
+ <!-- check that new entry "uid=igueye, ou=People,
+ ${DIRECTORY_BASE}" exists -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=igueye, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : 'uid=jwallace'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <call function="'checktestRC'">
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1
+ }
+ </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Encryption Tests
+ #@TestName Replication: Encryption: Rename Subtree
+ #@TestID Rename Subtree
+ #@TestPurpose Check that a subtree rename (moddn) operation
+ is well propagated by secured replication.
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_encryption_010" scope="local">
+ <testcase name="getTestCaseName('Rename Subtree')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check that a subtree rename (moddn) operation is well propagated by secured replication.' % msg1 }
+ </call>
+
+ <script>
+ filename = 'replication_moddn.ldif'
+ filePath = '%s/%s' % (local.temp,filename)
+ dn = 'ou=People,%s' % synchroSuffix
+ newrdn = 'ou=Special People'
+ newsuperior = 'ou=Special Users,%s' % synchroSuffix
+ deleteoldrdn = 0
+ write_replication_moddn_ldif_file(filePath, dn, newrdn,
+ newsuperior, deleteoldrdn)
+ </script>
+
+ <!-- Copy the replication_mod ldif to client host -->
+ <message>
+ 'Copy %s file from %s to %s' % (filename,local.temp,
+ client.getTmpDir())
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (client.getTmpDir(),filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (client.getTmpDir(), filename)
+ }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}"
+ does NOT exist anymore -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=gfarmer, ou=People,%s' \
+ % synchroSuffix,
+ 'dsFilter' : 'objectclass=*',
+ 'expectedRC' : 32
+ }
+ </call>
+
+ <!-- check that new entry "uid=gfarmer, ou=Special People,
+ ou=Special Users, ${DIRECTORY_BASE}" exists -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'dsBaseDN' : 'uid=gfarmer, ou=Special People, \
+ ou=Special Users,%s' % synchroSuffix,
+ 'dsFilter' : 'objectclass=*'
+ }
+ </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover.xml
index 3b9a4c3..1554258 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover.xml
@@ -7,540 +7,143 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2007-2010 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
-
<defaultcall function="replication_failover"/>
-
- <function name="replication_failover">
-
+ <function name="replication_failover" scope="local">
<sequence>
-
- <block name="'failover'">
-
- <sequence>
-
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication Failover Tests
- #@TestSuitePurpose Verify that the failover of a replication server does not affect replication.
- #@TestSuiteID Failover Tests
- #@TestSuiteGroup Failover
- #@TestGroup Replication
- #@TestScript replication_failover.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
- <call function="'replication_setup'">
- { 'topologyFile' : '%s/3server_topology.txt' % REPLICATION_CONFIG_DIR ,
- 'label' : 'Replication Failover' }
- </call>
-
- <script>
- synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
- </script>
-
-
- <!-- Load entries into "master" server -->
- <!-- Stop "master" Directory Server -->
- <call function="'StopDsWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsHost' : masterHost,
- 'dsAdminPort' : master.getAdminPort(),
- 'dsBindDN' : master.getRootDn(),
- 'dsBindPwd' : master.getRootPwd(),
- 'noOfLoops' : 30
- }
- </call>
+ <block name="'replication_failover'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'failover'
- <!-- Import data into "master" Directory Server -->
- <call function="'ImportLdifWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'backEnd' : DIRECTORY_INSTANCE_BE,
- 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir
- }
- </call>
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication Failover'
+ </script>
- <!-- Start the Directory Server -->
- <call function="'StartDsWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath
- }
- </call>
-
- <!-- Wait for DS to start -->
- <call function="'isAlive'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'noOfLoops' : 10 ,
- 'noOfMilliSeconds' : 2000
- }
- </call>
-
- <!-- Initialise the servers in the topology -->
-<!--
- <call function="'initializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'sourceInstanceHost' : masterHost,
- 'sourceInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : ['o=example']
- }
- </call>
--->
- <iterate var="server" in="consumerList">
- <!-- Perform the total update -->
- <call function="'initializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstanceAdminPort' : server.getAdminPort(),
- 'sourceInstanceHost' : masterHost,
- 'sourceInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : ['o=example']
- }
- </call>
- </iterate>
-
-
- <!--- Test Case information
- #@TestMarker Replication Failover Tests
- #@TestName Replication: Failover: One server down (stopped)
- #@TestID One server down (stopped)
- #@TestPurpose Check replication when one server is off-line
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName('One server down (stopped)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Failover: One server down (stopped). Check replication when one server is off-line '
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
- <sequence>
-
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- nbOfServers = len(_topologyServerList)
- nextServer = _topologyServerList[(i + 1) % nbOfServers]
- nextServerPath = '%s/%s' % (nextServer.getDir(), OPENDSNAME)
- userDn = 'uid=iabizen-%s, ou=People, %s' % (i, synchroSuffix)
-
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
- <!-- Stop server (simulate failover?) -->
- <call function="'StopDsWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath,
- 'dsHost' : server.getHostname(),
- 'dsAdminPort' : server.getAdminPort(),
- 'dsBindDN' : server.getRootDn(),
- 'dsBindPwd' : server.getRootPwd(),
- 'noOfLoops' : 30
- }
- </call>
- <if expr="globalSplitServers">
- <call function="'StopDsWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath,
- 'dsHost' : replServer.getHostname(),
- 'dsAdminPort' : replServer.getAdminPort(),
- 'dsBindDN' : replServer.getRootDn(),
- 'dsBindPwd' : replServer.getRootPwd(),
- 'noOfLoops' : 30
- }
- </call>
- </if>
-
- <!-- Add entry to one of the other servers -->
- <script>
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen-%s' % i)
- listAttr.append('sn:Abizen-%s' % i)
- listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : nextServer.getHostname(),
- 'dsPath' : nextServerPath,
- 'dsInstanceHost' : nextServer.getHostname(),
- 'dsInstancePort' : nextServer.getPort(),
- 'dsInstanceDn' : nextServer.getRootDn(),
- 'dsInstancePswd' : nextServer.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Start the server again -->
- <call function="'StartDsWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath
- }
- </call>
- <if expr="globalSplitServers">
- <call function="'StartDsWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath
- }
- </call>
- </if>
- </sequence>
- </iterate>
-
-
- <!-- Verify the synchronization of the trees among the servers in the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Failover Tests
- #@TestName Replication: Failover: All but one servers down (stopped)
- #@TestID All but one servers down (stopped)
- #@TestPurpose Check replication when all but one servers are off-line
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName('All but one servers down (stopped)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Failover: All but one servers down (stopped). Check replication when all but one servers are off-line'
- </message>
-
- <!-- Stop the "consumer" servers -->
- <call function="'stopServers'">
- [consumerList, 30]
- </call>
- <if expr="globalSplitServers">
- <call function="'stopServers'">
- [_topologyReplServerList[1:], 30]
- </call>
- </if>
-
-
- <!-- Add entry to master servers -->
- <script>
- userDn = 'uid=iabizen-berri, ou=People, %s' % synchroSuffix
+ <!--- Test Suite information
+ #@TestSuiteName Replication Failover Tests
+ #@TestSuitePurpose Verify that the total-update operations are replicated
+ correctly between two servers.
+ #@TestSuiteID Failover Tests
+ #@TestSuiteGroup Failover
+ #@TestGroup Replication
+ #@TestScript replication_failover.xml
+ #@TestHTMLLink http://www.forgerock.org/
+ -->
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen-berri')
- listAttr.append('sn:Abizen-berri')
- listAttr.append('cn:Izen-berri Abizen-berri')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
+ <call function="'testSuite_Preamble'"/>
- <!-- Start the "consumer" servers -->
- <call function="'startServers'">
- [consumerList]
- </call>
- <if expr="globalSplitServers">
- <call function="'startServers'">
- [_topologyReplServerList[1:]]
+ <try>
+ <sequence>
+
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
+ <call function="'replication_setup'">
+ { 'topologyFile' : '%s/3server_topology.txt' % REPLICATION_CONFIG_DIR ,
+ 'label' : _label }
</call>
- </if>
-
-
- <!-- Verify the synchronization of the trees among the servers in the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
+
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('failover/failover_tests')
+ </script>
+
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
+
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: Failover:'
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_failover_001')
+ testsList.append('replication_failover_002')
+ testsList.append('replication_failover_003')
+ testsList.append('replication_failover_004')
+ testsList.append('replication_failover_005')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
+ </sequence>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Failover Tests
- #@TestName Replication: Failover: One server down (killed)
- #@TestID One server down (killed)
- #@TestPurpose Check replication when one server fails
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName('One server down (killed)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Failover: One server down (killed). Check replication when one server fails'
- </message>
-
- <iterate var="server" in="_topologyServerList" indexvar="i">
+ <catch exception="'STAFException.TestSuite.SetupException'">
<sequence>
-
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
- nbOfServers = len(_topologyServerList)
- nextServer = _topologyServerList[(i + 1) % nbOfServers]
- nextServerPath = '%s/%s' % (nextServer.getDir(), OPENDSNAME)
- userDn = 'uid=ideiturak-%s, ou=People, %s' % (i, synchroSuffix)
-
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
- <!-- Kill server (simulate failover?) -->
- <call function="'killDs'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath
- }
- </call>
- <if expr="globalSplitServers">
- <call function="'killDs'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath
- }
- </call>
- </if>
-
- <!-- Add entry to one of the other servers -->
- <script>
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen-%s' % i)
- listAttr.append('sn:Deiturak-%s' % i)
- listAttr.append('cn:Izen-%s Deiturak-%s' % (i, i))
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : nextServer.getHostname(),
- 'dsPath' : nextServerPath,
- 'dsInstanceHost' : nextServer.getHostname(),
- 'dsInstancePort' : nextServer.getPort(),
- 'dsInstanceDn' : nextServer.getRootDn(),
- 'dsInstancePswd' : nextServer.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Start the server again -->
- <call function="'StartDsWithScript'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath
- }
- </call>
- <if expr="globalSplitServers">
- <call function="'StartDsWithScript'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath
- }
- </call>
- </if>
-
- </sequence>
- </iterate>
-
-
- <!-- Verify the synchronization of the trees among the servers in the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Failover Tests
- #@TestName Replication: Failover: All but one servers down (killed)
- #@TestID One server down (killed)
- #@TestPurpose Check replication when all but one servers fail
- #@TestPreamble
- #@TestSteps
- #@TestPostamble
- #@TestResult
- -->
- <testcase name="getTestCaseName('All but one servers down (killed)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Failover: All but one servers down (killed). Check replication when all but one servers fail'
- </message>
-
- <paralleliterate var="server" in="consumerList" indexvar="i">
- <sequence>
- <script>
- serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
-
- if globalSplitServers:
- replServer = _topologyReplServerList[i+1]
- else:
- replServer = server
-
- replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
- </script>
-
- <!-- Kill server (simulate failover?) -->
- <call function="'killDs'">
- { 'location' : server.getHostname(),
- 'dsPath' : serverPath
- }
- </call>
- <if expr="globalSplitServers">
- <call function="'killDs'">
- { 'location' : replServer.getHostname(),
- 'dsPath' : replServerPath
- }
- </call>
- </if>
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
+ </message>
+ <rethrow/>
</sequence>
- </paralleliterate>
-
-
- <!-- Add entry to master servers -->
- <script>
- userDn = 'uid=ideitura-berriak, ou=People, %s' % synchroSuffix
-
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Izen-berri')
- listAttr.append('sn:Deitura-berriak')
- listAttr.append('cn:Izen-berri Deitura-berriak')
- </script>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
+
+ </try>
+
+ </sequence>
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : userDn,
- 'listAttributes' : listAttr,
- 'expectedRC' : 0
- }
- </call>
-
- <!-- Start the "consumer" servers -->
- <call function="'startServers'">
- [consumerList]
- </call>
- <if expr="globalSplitServers">
- <call function="'startServers'">
- [_topologyReplServerList[1:]]
- </call>
- </if>
-
-
- <!-- Verify the synchronization of the trees among the servers in the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
</sequence>
- </testcase>
-
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication Failover' }
- </call>
-
- <call function="'testSuite_Postamble'"/>
-
- </sequence>
-
+ </finally>
+
+ </try>
</block>
-
</sequence>
-
</function>
-
</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover_tests.xml
new file mode 100644
index 0000000..df303a8
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/failover/failover_tests.xml
@@ -0,0 +1,611 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2007-2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!--- Test Case information
+ #@TestMarker Replication Failover Tests
+ #@TestName Replication: Failover: Preamble
+ #@TestID Preamble
+ #@TestPurpose Initialize the replication topology
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_failover_001" scope="local">
+ <testcase name="getTestCaseName('Failover Preamble')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialize the replication topology.' % msg1 }
+ </call>
+
+ <script>
+ synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
+ </script>
+
+
+ <!-- Load entries into "master" server -->
+ <!-- Stop "master" Directory Server -->
+ <call function="'StopDsWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsHost' : masterHost,
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsBindDN' : master.getRootDn(),
+ 'dsBindPwd' : master.getRootPwd(),
+ 'noOfLoops' : 30
+ }
+ </call>
+
+ <!-- Import data into "master" Directory Server -->
+ <call function="'ImportLdifWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'backEnd' : DIRECTORY_INSTANCE_BE,
+ 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir
+ }
+ </call>
+
+ <!-- Start the Directory Server -->
+ <call function="'StartDsWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath
+ }
+ </call>
+
+ <!-- Wait for DS to start -->
+ <call function="'isAlive'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'noOfLoops' : 10 ,
+ 'noOfMilliSeconds' : 2000
+ }
+ </call>
+
+ <iterate var="server" in="consumerList">
+ <!-- Perform the total update -->
+ <call function="'initializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstanceAdminPort' : server.getAdminPort(),
+ 'sourceInstanceHost' : masterHost,
+ 'sourceInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : ['o=example']
+ }
+ </call>
+ </iterate>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication Failover Tests
+ #@TestName Replication: Failover: One server down (stopped)
+ #@TestID One server down (stopped)
+ #@TestPurpose Check replication when one server is off-line
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_failover_002" scope="local">
+ <testcase name="getTestCaseName('One server down (stopped)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication when one server is off-line.' % msg1 }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ nbOfServers = len(_topologyServerList)
+ nextServer = _topologyServerList[(i + 1) % nbOfServers]
+ nextServerPath = '%s/%s' % (nextServer.getDir(), OPENDSNAME)
+ userDn = 'uid=iabizen-%s, ou=People, %s' % (i, synchroSuffix)
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Stop server (simulate failover?) -->
+ <call function="'StopDsWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath,
+ 'dsHost' : server.getHostname(),
+ 'dsAdminPort' : server.getAdminPort(),
+ 'dsBindDN' : server.getRootDn(),
+ 'dsBindPwd' : server.getRootPwd(),
+ 'noOfLoops' : 30
+ }
+ </call>
+ <if expr="globalSplitServers">
+ <call function="'StopDsWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsHost' : replServer.getHostname(),
+ 'dsAdminPort' : replServer.getAdminPort(),
+ 'dsBindDN' : replServer.getRootDn(),
+ 'dsBindPwd' : replServer.getRootPwd(),
+ 'noOfLoops' : 30
+ }
+ </call>
+ </if>
+
+ <!-- Add entry to one of the other servers -->
+ <script>
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen-%s' % i)
+ listAttr.append('sn:Abizen-%s' % i)
+ listAttr.append('cn:Izen-%s Abizen-%s' % (i, i))
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : nextServer.getHostname(),
+ 'dsPath' : nextServerPath,
+ 'dsInstanceHost' : nextServer.getHostname(),
+ 'dsInstancePort' : nextServer.getPort(),
+ 'dsInstanceDn' : nextServer.getRootDn(),
+ 'dsInstancePswd' : nextServer.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Start the server again -->
+ <call function="'StartDsWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath
+ }
+ </call>
+ <if expr="globalSplitServers">
+ <call function="'StartDsWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath
+ }
+ </call>
+ </if>
+ </sequence>
+ </iterate>
+
+
+ <!-- Verify the synchronization of the trees among the servers in the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Failover Tests
+ #@TestName Replication: Failover: All but one servers down (stopped)
+ #@TestID All but one servers down (stopped)
+ #@TestPurpose Check replication when all but one servers are off-line
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_failover_003" scope="local">
+ <testcase name="getTestCaseName('All but one servers down (stopped)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication when all but one servers are off-line.' % msg1 }
+ </call>
+
+ <!-- Stop the "consumer" servers -->
+ <call function="'stopServers'">
+ [consumerList, 30]
+ </call>
+ <if expr="globalSplitServers">
+ <call function="'stopServers'">
+ [_topologyReplServerList[1:], 30]
+ </call>
+ </if>
+
+
+ <!-- Add entry to master servers -->
+ <script>
+ userDn = 'uid=iabizen-berri, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen-berri')
+ listAttr.append('sn:Abizen-berri')
+ listAttr.append('cn:Izen-berri Abizen-berri')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Start the "consumer" servers -->
+ <call function="'startServers'">
+ [consumerList]
+ </call>
+ <if expr="globalSplitServers">
+ <call function="'startServers'">
+ [_topologyReplServerList[1:]]
+ </call>
+ </if>
+
+
+ <!-- Verify the synchronization of the trees among the servers in the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Failover Tests
+ #@TestName Replication: Failover: One server down (killed)
+ #@TestID One server down (killed)
+ #@TestPurpose Check replication when one server fails
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_failover_004" scope="local">
+ <testcase name="getTestCaseName('One server down (killed)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication when one server fails.' % msg1 }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+ nbOfServers = len(_topologyServerList)
+ nextServer = _topologyServerList[(i + 1) % nbOfServers]
+ nextServerPath = '%s/%s' % (nextServer.getDir(), OPENDSNAME)
+ userDn = 'uid=ideiturak-%s, ou=People, %s' % (i, synchroSuffix)
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Kill server (simulate failover?) -->
+ <call function="'killDs'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath
+ }
+ </call>
+ <if expr="globalSplitServers">
+ <call function="'killDs'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath
+ }
+ </call>
+ </if>
+
+ <!-- Add entry to one of the other servers -->
+ <script>
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen-%s' % i)
+ listAttr.append('sn:Deiturak-%s' % i)
+ listAttr.append('cn:Izen-%s Deiturak-%s' % (i, i))
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : nextServer.getHostname(),
+ 'dsPath' : nextServerPath,
+ 'dsInstanceHost' : nextServer.getHostname(),
+ 'dsInstancePort' : nextServer.getPort(),
+ 'dsInstanceDn' : nextServer.getRootDn(),
+ 'dsInstancePswd' : nextServer.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Start the server again -->
+ <call function="'StartDsWithScript'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath
+ }
+ </call>
+ <if expr="globalSplitServers">
+ <call function="'StartDsWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath
+ }
+ </call>
+ </if>
+
+ </sequence>
+ </iterate>
+
+
+ <!-- Verify the synchronization of the trees among the servers in the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Failover Tests
+ #@TestName Replication: Failover: All but one servers down (killed)
+ #@TestID One server down (killed)
+ #@TestPurpose Check replication when all but one servers fail
+ #@TestPreamble
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <function name="replication_failover_005" scope="local">
+ <testcase name="getTestCaseName('All but one servers down (killed)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check replication when all but one servers fails.' % msg1 }
+ </call>
+
+ <paralleliterate var="server" in="consumerList" indexvar="i">
+ <sequence>
+ <script>
+ serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
+
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i+1]
+ else:
+ replServer = server
+
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Kill server (simulate failover?) -->
+ <call function="'killDs'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : serverPath
+ }
+ </call>
+ <if expr="globalSplitServers">
+ <call function="'killDs'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath
+ }
+ </call>
+ </if>
+ </sequence>
+ </paralleliterate>
+
+
+ <!-- Add entry to master servers -->
+ <script>
+ userDn = 'uid=ideitura-berriak, ou=People, %s' % synchroSuffix
+
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Izen-berri')
+ listAttr.append('sn:Deitura-berriak')
+ listAttr.append('cn:Izen-berri Deitura-berriak')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : userDn,
+ 'listAttributes' : listAttr,
+ 'expectedRC' : 0
+ }
+ </call>
+
+ <!-- Start the "consumer" servers -->
+ <call function="'startServers'">
+ [consumerList]
+ </call>
+ <if expr="globalSplitServers">
+ <call function="'startServers'">
+ [_topologyReplServerList[1:]]
+ </call>
+ </if>
+
+
+ <!-- Verify the synchronization of the trees among the servers in the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml
index 51bb7c8..b1442d2 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml
@@ -7,433 +7,140 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2007-2010 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
-
<defaultcall function="replication_ldifimport"/>
-
- <function name="replication_ldifimport">
-
+ <function name="replication_ldifimport" scope="local">
<sequence>
-
- <block name="'ldifimport'">
-
- <sequence>
-
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication Ldif Import Tests
- #@TestSuitePurpose Verify that the servers in a replicated topology
- can be initialised by the means of an ldif
- import.
- #@TestSuiteID Ldif Import Tests
- #@TestSuiteGroup Ldif Import
- #@TestGroup Replication
- #@TestScript replication_ldifimport.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'" >
- { 'label' : 'Replication LDIFimport' }
- </call>
-
-
- <!--- Test Case information
- #@TestMarker Replication Ldif Import Tests
- #@TestName Replication: Ldif Import: Off-line
- initialisation
- #@TestID Off-line initialisation
- #@TestPurpose Initialise replicated servers using off-line
- export/import
- #@TestPreamble
- #@TestSteps Call dsreplication pre-external-initialization
- #@TestSteps Stop servers
- #@TestSteps Import data on server A
- #@TestSteps Export suffix on server A
- #@TestSteps Import exported file on other servers
- #@TestSteps Start servers
- #@TestSteps Call dsreplication post-external-initialization
- #@TestSteps Add entry on server A
- #@TestPostamble
- #@TestResult Success if trees synchronized
- -->
- <testcase name="getTestCaseName('Off-line initialisation')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Ldif Import: Off-line initialisation. \
- Initialise replicated servers using off-line export/import'
- </message>
-
- <!-- Pre-initialise the servers in the topology -->
- <message>
- '+++++ ldif import off-line: prepare servers for external \
- initialization'
- </message>
- <call function="'preInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'localOnly' : False,
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Stop the servers in the topology -->
- <call function="'stopServers'">
- [_topologyServerList]
- </call>
+ <block name="'replication_ldifimport'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'ldifimport'
-
- <!-- Import data into "master" server -->
- <message>
- '+++++ ldif import off-line: import data on %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'ImportLdifWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'backEnd' : DIRECTORY_INSTANCE_BE,
- 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir
- }
- </call>
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication LDIFImport'
+ </script>
- <!-- Export data from "master" server -->
- <message>
- '+++++ ldif import off-line: export suffix on server %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'exportLdifWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'ldifFile' : '%s/replication/master_export_offline.ldif' \
- % masterBackupDir
- }
- </call>
-
- <!-- Copy export file to "consumer" servers and import it -->
- <paralleliterate var="consumer" in="consumerList">
- <sequence>
- <script>
- consumerDataDir = '%s' % consumer.getDataDir()
- consumerBackupDir = '%s' % consumer.getTmpDir()
- </script>
- <call function="'copyFile'">
- { 'location' : masterHost,
- 'remotehost' : consumer.getHostname(),
- 'srcfile' : '%s/replication/master_export_offline.ldif' \
- % masterBackupDir,
- 'destfile' : '%s/replication/master_export_offline.ldif' \
- % consumerBackupDir
- }
- </call>
-
- <message>
- '+++++ ldif import off-line: import exported file on %s:%s'\
- % (consumer.getHostname(), consumer.getPort())
- </message>
- <call function="'ImportLdifWithScript'">
- { 'location' : consumer.getHostname(),
- 'dsPath' : '%s/%s' % (consumer.getDir(), OPENDSNAME),
- 'backEnd' : DIRECTORY_INSTANCE_BE,
- 'ldifFile' : '%s/replication/master_export_offline.ldif' \
- % consumerBackupDir
- }
- </call>
- </sequence>
- </paralleliterate>
-
- <!-- Start the servers in the topology -->
- <call function="'startServers'">
- [_topologyServerList]
- </call>
-
- <!-- Check some data was imported into "master" server -->
- <call function="'checkImport'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsHost' : masterHost,
- 'dsPort' : master.getPort(),
- 'dsAdminPort' : master.getAdminPort(),
- 'dsDn' : master.getRootDn(),
- 'dsPswd' : master.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=rhunt, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
-
- <!-- Post-initialise the servers in the topology -->
- <message>
- '+++++ ldif import off-line: end external server initialization'
- </message>
- <call function="'postInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Add entry to "master" server -->
- <message>
- '+++++ ldif import off-line: add entry to %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
- % clientDataDir
- }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Ldif Import Tests
- #@TestName Replication: Ldif Import: On-line initialisation
- #@TestID On-line initialisation
- #@TestPurpose Initialise replicated servers using on-line
- export/import
- #@TestPreamble
- #@TestSteps Call dsreplication pre-external-initialization
- #@TestSteps Import data on server A
- #@TestSteps Export suffix on server A
- #@TestSteps Import exported file on other servers
- #@TestSteps Call dsreplication post-external-initialization
- #@TestSteps Add entry on server A
- #@TestPostamble
- #@TestResult Success if trees synchronized
- -->
- <testcase name="getTestCaseName('On-line initialisation')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Ldif Import: On-line initialisation. Initialise \
- replicated servers using on-line export/import'
- </message>
-
- <!-- Pre-initialise the servers in the topology -->
- <message>
- '+++++ ldif import on-line: prepare servers for external \
- initialization'
- </message>
- <call function="'preInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'localOnly' : False,
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Import data into "master" server -->
- <message>
- '+++++ ldif import on-line: import data on %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'ImportLdifWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'ldifFile' : '%s/replication/Example.ldif' \
- % masterDataDir
- }
- </call>
-
- <!-- Check some data was imported into "master" server -->
- <call function="'checkImport'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsHost' : masterHost,
- 'dsPort' : master.getPort(),
- 'dsAdminPort' : master.getAdminPort(),
- 'dsDn' : master.getRootDn(),
- 'dsPswd' : master.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=rhunt, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
-
- <script>
- sourceFile = '%s/replication/master_export_online.ldif' \
- % masterBackupDir
- </script>
-
- <!-- Export data from "master" server -->
- <message>
- '+++++ ldif import on-line: export suffix on server %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'exportLdifWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'ldifFile' : sourceFile
- }
- </call>
-
- <!-- Copy export file to "consumer" servers and import it -->
- <paralleliterate var="consumer" in="consumerList">
- <sequence>
- <script>
- consumerDataDir = '%s' % consumer.getDataDir()
- consumerBackupDir = '%s' % consumer.getTmpDir()
- </script>
- <script>
- filename = 'master_export_online.ldif'
- destinationFile = '%s/replication/%s'\
- % (consumerBackupDir,filename)
- </script>
-
- <call function="'copyFile'">
- { 'location' : masterHost,
- 'remotehost' : consumer.getHostname(),
- 'srcfile' : sourceFile,
- 'destfile' : destinationFile
- }
- </call>
-
- <message>
- '+++++ ldif import on-line: import exported file on %s:%s'\
- % (consumer.getHostname(), consumer.getPort())
- </message>
- <call function="'ImportLdifWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumer.getHostname(),
- 'dsInstanceAdminPort' : consumer.getAdminPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'ldifFile' : destinationFile
- }
- </call>
- </sequence>
- </paralleliterate>
-
- <!-- Post-initialise the servers in the topology -->
- <message>
- '+++++ ldif import on-line: end external server initialization'
- </message>
- <call function="'postInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Add entry to "master" server -->
- <message>
- '+++++ ldif import on-line: add entry to %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
- % clientDataDir
- }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication LDIFimport' }
- </call>
-
- <call function="'testSuite_Postamble'"/>
+ <!--- Test Suite information
+ #@TestSuiteName Replication LDIFImport Tests
+ #@TestSuitePurpose Verify that the total-update operations are replicated
+ correctly between two servers.
+ #@TestSuiteID LDIFImport Tests
+ #@TestSuiteGroup LDIFImport
+ #@TestGroup Replication
+ #@TestScript replication_ldifimport.xml
+ #@TestHTMLLink http://www.forgerock.org/
+ -->
- </sequence>
+ <call function="'testSuite_Preamble'"/>
+ <try>
+ <sequence>
+
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'" >
+ { 'label' : _label }
+ </call>
+
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('ldifimport/ldifimport_tests')
+ </script>
+
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
+
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: LDIFImport:'
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_ldifimport_001')
+ testsList.append('replication_ldifimport_002')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ <catch exception="'STAFException.TestSuite.SetupException'">
+ <sequence>
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
+ </message>
+ <rethrow/>
+ </sequence>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
+
+ </try>
+
+ </sequence>
+
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </finally>
+
+ </try>
</block>
-
</sequence>
-
</function>
-
</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport_tests.xml
new file mode 100644
index 0000000..85cf44e
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport_tests.xml
@@ -0,0 +1,421 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2007-2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!--- Test Case information
+ #@TestMarker Replication Ldif Import Tests
+ #@TestName Replication: Ldif Import: Off-line
+ initialisation
+ #@TestID Off-line initialisation
+ #@TestPurpose Initialise replicated servers using off-line
+ export/import
+ #@TestPreamble
+ #@TestSteps Call dsreplication pre-external-initialization
+ #@TestSteps Stop servers
+ #@TestSteps Import data on server A
+ #@TestSteps Export suffix on server A
+ #@TestSteps Import exported file on other servers
+ #@TestSteps Start servers
+ #@TestSteps Call dsreplication post-external-initialization
+ #@TestSteps Add entry on server A
+ #@TestPostamble
+ #@TestResult Success if trees synchronized
+ -->
+ <function name="replication_ldifimport_001" scope="local">
+ <testcase name="getTestCaseName('Off-line initialisation')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialise replicated servers using off-line export/import.' % msg1 }
+ </call>
+
+ <!-- Pre-initialise the servers in the topology -->
+ <message>
+ '+++++ ldif import off-line: prepare servers for external \
+ initialization'
+ </message>
+ <call function="'preInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'localOnly' : False,
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <call function="'stopServers'">
+ [_topologyServerList]
+ </call>
+
+
+ <!-- Import data into "master" server -->
+ <message>
+ '+++++ ldif import off-line: import data on %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'ImportLdifWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'backEnd' : DIRECTORY_INSTANCE_BE,
+ 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir
+ }
+ </call>
+
+ <!-- Export data from "master" server -->
+ <message>
+ '+++++ ldif import off-line: export suffix on server %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'exportLdifWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'ldifFile' : '%s/replication/master_export_offline.ldif' \
+ % masterBackupDir
+ }
+ </call>
+
+ <!-- Copy export file to "consumer" servers and import it -->
+ <paralleliterate var="consumer" in="consumerList">
+ <sequence>
+ <script>
+ consumerDataDir = '%s' % consumer.getDataDir()
+ consumerBackupDir = '%s' % consumer.getTmpDir()
+ </script>
+ <call function="'copyFile'">
+ { 'location' : masterHost,
+ 'remotehost' : consumer.getHostname(),
+ 'srcfile' : '%s/replication/master_export_offline.ldif' \
+ % masterBackupDir,
+ 'destfile' : '%s/replication/master_export_offline.ldif' \
+ % consumerBackupDir
+ }
+ </call>
+
+ <message>
+ '+++++ ldif import off-line: import exported file on %s:%s'\
+ % (consumer.getHostname(), consumer.getPort())
+ </message>
+ <call function="'ImportLdifWithScript'">
+ { 'location' : consumer.getHostname(),
+ 'dsPath' : '%s/%s' % (consumer.getDir(), OPENDSNAME),
+ 'backEnd' : DIRECTORY_INSTANCE_BE,
+ 'ldifFile' : '%s/replication/master_export_offline.ldif' \
+ % consumerBackupDir
+ }
+ </call>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Start the servers in the topology -->
+ <call function="'startServers'">
+ [_topologyServerList]
+ </call>
+
+ <!-- Check some data was imported into "master" server -->
+ <call function="'checkImport'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsHost' : masterHost,
+ 'dsPort' : master.getPort(),
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsDn' : master.getRootDn(),
+ 'dsPswd' : master.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=rhunt, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+
+ <!-- Post-initialise the servers in the topology -->
+ <message>
+ '+++++ ldif import off-line: end external server initialization'
+ </message>
+ <call function="'postInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <message>
+ '+++++ ldif import off-line: add entry to %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
+ % clientDataDir
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Ldif Import Tests
+ #@TestName Replication: Ldif Import: On-line initialisation
+ #@TestID On-line initialisation
+ #@TestPurpose Initialise replicated servers using on-line
+ export/import
+ #@TestPreamble
+ #@TestSteps Call dsreplication pre-external-initialization
+ #@TestSteps Import data on server A
+ #@TestSteps Export suffix on server A
+ #@TestSteps Import exported file on other servers
+ #@TestSteps Call dsreplication post-external-initialization
+ #@TestSteps Add entry on server A
+ #@TestPostamble
+ #@TestResult Success if trees synchronized
+ -->
+ <function name="replication_ldifimport_002" scope="local">
+ <testcase name="getTestCaseName('On-line initialisation')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialise replicated servers using on-line export/import.' % msg1 }
+ </call>
+
+ <!-- Pre-initialise the servers in the topology -->
+ <message>
+ '+++++ ldif import on-line: prepare servers for external \
+ initialization'
+ </message>
+ <call function="'preInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'localOnly' : False,
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Import data into "master" server -->
+ <message>
+ '+++++ ldif import on-line: import data on %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'ImportLdifWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'ldifFile' : '%s/replication/Example.ldif' \
+ % masterDataDir
+ }
+ </call>
+
+ <!-- Check some data was imported into "master" server -->
+ <call function="'checkImport'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsHost' : masterHost,
+ 'dsPort' : master.getPort(),
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsDn' : master.getRootDn(),
+ 'dsPswd' : master.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=rhunt, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+
+ <script>
+ sourceFile = '%s/replication/master_export_online.ldif' \
+ % masterBackupDir
+ </script>
+
+ <!-- Export data from "master" server -->
+ <message>
+ '+++++ ldif import on-line: export suffix on server %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'exportLdifWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'ldifFile' : sourceFile
+ }
+ </call>
+
+ <!-- Copy export file to "consumer" servers and import it -->
+ <paralleliterate var="consumer" in="consumerList">
+ <sequence>
+ <script>
+ consumerDataDir = '%s' % consumer.getDataDir()
+ consumerBackupDir = '%s' % consumer.getTmpDir()
+ </script>
+ <script>
+ filename = 'master_export_online.ldif'
+ destinationFile = '%s/replication/%s'\
+ % (consumerBackupDir,filename)
+ </script>
+
+ <call function="'copyFile'">
+ { 'location' : masterHost,
+ 'remotehost' : consumer.getHostname(),
+ 'srcfile' : sourceFile,
+ 'destfile' : destinationFile
+ }
+ </call>
+
+ <message>
+ '+++++ ldif import on-line: import exported file on %s:%s'\
+ % (consumer.getHostname(), consumer.getPort())
+ </message>
+ <call function="'ImportLdifWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumer.getHostname(),
+ 'dsInstanceAdminPort' : consumer.getAdminPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'ldifFile' : destinationFile
+ }
+ </call>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Post-initialise the servers in the topology -->
+ <message>
+ '+++++ ldif import on-line: end external server initialization'
+ </message>
+ <call function="'postInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <message>
+ '+++++ ldif import on-line: add entry to %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
+ % clientDataDir
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization.xml
index 03e17ca..615562d 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization.xml
@@ -7,836 +7,150 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2007-2010 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
<defaultcall function="replication_resynchronization"/>
- <function name="replication_resynchronization">
+ <function name="replication_resynchronization" scope="local">
<sequence>
- <block name="'resynchronization'">
- <sequence>
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
- <call function="'testSuite_Preamble'"/>
- <!--- Test Suite information
- #@TestSuiteName Replication Re-Synchronization Tests
- #@TestSuitePurpose Verify that the servers in a replicated topology
- can be initialised with an old backup and still
- re-synchronize.
- #@TestSuiteID Re-Synchronization Tests
- #@TestSuiteGroup Re-Synchronization
- #@TestGroup Replication
- #@TestScript replication_resynchronization.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'">
- { 'topologyFile' : '%s/3server_topology.txt' \
- % REPLICATION_CONFIG_DIR,
- 'dataFile' : 'Example.ldif' ,
- 'label' : 'Replication Resync'
- }
- </call>
-
- <script>
- server3 = _topologyServerList[2]
-
- # Remove 3rd server from replicated servers list until replication
- # is enabled on the 3rd one
- _topologyServerList.remove(server3)
- consumerList.remove(server3)
- </script>
+ <block name="'replication_resynchronization'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'resynchronization'
+
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication Resync'
+ </script>
- <!-- Remove 3rd server from replication topology (i.e. disable
- replication) -->
- <call function="'disableReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server3.getHostname(),
- 'dsInstanceAdminPort' : server3.getAdminPort(),
- 'disableAll' : True
- }
- </call>
-
-
- <!--- Test Case information
- #@TestMarker Replication Re-Synchronization Tests
- #@TestName Replication: Re-Synchronization: Off-line
- initialisation
- #@TestID Off-line initialisation
- #@TestPurpose Initialise replicated servers using off-line
- backup/restore
- #@TestPreamble Back-up server A
- #@TestSteps Add entry on server A
- #@TestSteps Stop servers
- #@TestSteps Restore back-up on other servers
- #@TestSteps Start servers
- #@TestPostamble
- #@TestResult Success if trees synchronized
- -->
- <testcase name="getTestCaseName('Off-line initialisation')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <script>
- m = md5_hash()
- m.update(STAXCurrentTestcase)
- </script>
- <message>
- 'Replication: Re-Synchronization: Off-line initialisation. \
- Initialise replicated servers using off-line backup/restore'
- </message>
+ <!--- Test Suite information
+ #@TestSuiteName Replication LDIFImport Tests
+ #@TestSuitePurpose Verify that the total-update operations are replicated
+ correctly between two servers.
+ #@TestSuiteID LDIFImport Tests
+ #@TestSuiteGroup LDIFImport
+ #@TestGroup Replication
+ #@TestScript replication_resynchronization.xml
+ #@TestHTMLLink http://www.forgerock.org/
+ -->
+
+ <call function="'testSuite_Preamble'"/>
- <!-- Backup "master" server -->
- <message>
- '+++++ binary copy off-line: back-up server %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'backup'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest())
- }
- </call>
-
- <!-- Add entry to "master" server -->
- <message>
- '+++++ resynchronization off-line: add entry to %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
- % clientDataDir
- }
- </call>
-
- <!-- Stop the "consumer" servers -->
- <call function="'stopServers'">
- [consumerList]
- </call>
-
- <!-- Copy master backup to "consumer" servers and restore it -->
- <paralleliterate var="consumer" in="consumerList">
- <sequence>
- <script>
- consumerBackupDir = '%s' % consumer.getTmpDir()
- </script>
- <call function="'CopyFolderByExtension'">
- { 'location' : masterHost,
- 'remotehost' : consumer.getHostname(),
- 'srcfolder' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest()),
- 'destfolder' : '%s/replication/master_backup_%s' \
- % (consumerBackupDir,m.hexdigest()),
- 'extension' : '*'
- }
- </call>
+ <try>
- <message>
- '+++++ resynchronization off-line: restore backup on %s:%s'\
- % (consumer.getHostname(), consumer.getPort())
- </message>
- <call function="'restore'">
- { 'location' : consumer.getHostname(),
- 'dsPath' : '%s/%s' % (consumer.getDir(), OPENDSNAME),
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (consumerBackupDir,m.hexdigest())
- }
- </call>
- </sequence>
- </paralleliterate>
-
- <!-- Start the "consumer" servers -->
- <call function="'startServers'">
- [consumerList]
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
- <!--- Test Case information
- #@TestMarker Replication Re-Synchronization Tests
- #@TestName Replication: Re-Synchronization: On-line
- initialisation
- #@TestID On-line initialisation
- #@TestPurpose Initialise replicated servers using on-line
- backup/restore
- #@TestPreamble
- #@TestSteps Call dsreplication pre-external-initialization
- #@TestSteps Import data on server A
- #@TestSteps Back-up server A
- #@TestSteps Call dsreplication post-external-initialization
- #@TestSteps Add entry on server A
- #@TestSteps Restore back-up on other servers
- #@TestPostamble
- #@TestResult Success if trees synchronized
- -->
- <testcase name="getTestCaseName('On-line initialisation')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <script>
- m = md5_hash()
- m.update(STAXCurrentTestcase)
- </script>
- <message>
- 'Replication: Re-Synchronization: On-line initialisation. \
- Initialise replicated servers using on-line backup/restore'
- </message>
+ <sequence>
- <!-- Pre-initialise the servers in the topology -->
- <message>
- '+++++ resynchronization on-line: prepare servers for external \
- initialization'
- </message>
- <call function="'preInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'localOnly' : False,
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Import data into "master" server -->
- <message>
- '+++++ resynchronization on-line: import data on %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'ImportLdifWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'ldifFile' : '%s/replication/Example.ldif' \
- % masterDataDir
- }
- </call>
-
- <!-- Check some data was imported into "master" server -->
- <call function="'checkImport'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsHost' : masterHost,
- 'dsPort' : master.getPort(),
- 'dsAdminPort' : master.getAdminPort(),
- 'dsDn' : master.getRootDn(),
- 'dsPswd' : master.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=rhunt, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
-
- <!-- Backup "master" server -->
- <message>
- '+++++ resynchronization on-line: back-up server %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'backupTask'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'taskID' : 'backup task - tc2',
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest())
- }
- </call>
-
- <!-- Post-initialise the servers in the topology -->
- <message>
- '+++++ resynchronization on-line: end external server \
- initialization'
- </message>
- <call function="'postInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <!-- Add entry to "master" server -->
- <message>
- '+++++ resynchronization on-line: add entry to %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
- % clientDataDir
- }
- </call>
-
- <!-- Copy backup to "consumer" servers and restore it -->
- <paralleliterate var="consumer" in="consumerList">
- <sequence>
- <script>
- consumerBackupDir = '%s' % consumer.getTmpDir()
- </script>
- <call function="'CopyFolderByExtension'">
- { 'location' : masterHost,
- 'remotehost' : consumer.getHostname(),
- 'srcfolder' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest()),
- 'destfolder' : '%s/replication/master_backup_%s' \
- % (consumerBackupDir,m.hexdigest()),
- 'extension' : '*'
- }
- </call>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'">
+ { 'topologyFile' : '%s/3server_topology.txt' \
+ % REPLICATION_CONFIG_DIR,
+ 'dataFile' : 'Example.ldif' ,
+ 'label' : _label
+ }
+ </call>
- <message>
- '+++++ resynchronization on-line: restore back-up on %s:%s'\
- % (consumer.getHostname(), consumer.getPort())
- </message>
- <call function="'restoreTask'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumer.getHostname(),
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'taskID' : 'restore task - tc2',
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (consumerBackupDir,m.hexdigest())
- }
- </call>
- </sequence>
- </paralleliterate>
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('resynchronization/resynchronization_tests')
+ </script>
+
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
+
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: Resync:'
+ server3 = _topologyServerList[2]
+
+ _topologyServerList.remove(server3)
+ consumerList.remove(server3)
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_resync_001')
+ testsList.append('replication_resync_002')
+ testsList.append('replication_resync_003')
+ testsList.append('replication_resync_004')
+ </script>
+
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
+ </sequence>
-
- <!--- Test Case information
- #@TestMarker Replication Re-Synchronization Tests
- #@TestName Replication: Re-Synchronization: Add new server
- #@TestID Add new server
- #@TestPurpose Initialise newly added replicated server
- using on-line backup/restore
- #@TestPreamble
- #@TestSteps Call dsreplication pre-external-initialization
- #@TestSteps Import data on server A
- #@TestSteps Back-up server A
- #@TestSteps Initialise other servers from server A
- #@TestSteps Add entry on server A
- #@TestSteps Add server: enable replication
- #@TestSteps Restore back-up on new server
- #@TestPostamble
- #@TestResult Success if trees synchronized
- -->
- <testcase name="getTestCaseName('Add new Server')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <script>
- m = md5_hash()
- m.update(STAXCurrentTestcase)
- </script>
- <message>
- 'Replication: Re-Synchronization: Add new server. \
- Initialise newly added server using on-line backup/restore'
- </message>
-
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
+ <catch exception="'STAFException.TestSuite.SetupException'">
<sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
- </script>
- <!-- Search for entry add -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <message>
- '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
- (replServer.getHostname(), replServer.getPort(), searchResult)
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
</message>
+ <rethrow/>
</sequence>
- </paralleliterate>
-
- <!-- Pre-initialise the servers in the topology -->
- <message>
- '+++++ resynchronization add server: prepare servers for \
- external initialization'
- </message>
- <call function="'preInitializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'localOnly' : False,
- 'replicationDnList' : [synchroSuffix],
- 'adminUID' : adminUID,
- 'adminPswd' : adminPswd
- }
- </call>
-
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
- </script>
- <!-- Search for entry add -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <message>
- '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
- (replServer.getHostname(), replServer.getPort(), searchResult)
- </message>
- </sequence>
- </paralleliterate>
-
- <!-- Import data into "master" server -->
- <message>
- '+++++ resynchronization add server: import data on %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'ImportLdifWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'ldifFile' : '%s/replication/Example.ldif' \
- % masterDataDir
- }
- </call>
-
- <!-- Check some data was imported into "master" server -->
- <call function="'checkImport'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsHost' : masterHost,
- 'dsPort' : master.getPort(),
- 'dsAdminPort' : master.getAdminPort(),
- 'dsDn' : master.getRootDn(),
- 'dsPswd' : master.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=rhunt, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
-
- <!-- Backup "master" server -->
- <message>
- '+++++ resynchronization add server: back-up server %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'backupTask'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'taskID' : 'backup task - tc3',
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest())
- }
- </call>
-
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
- </script>
- <!-- Search for entry add -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <message>
- '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
- (replServer.getHostname(), replServer.getPort(), searchResult)
- </message>
- </sequence>
- </paralleliterate>
-
- <message>
- '+++++ resynchronization add server: Initialise topology from \
- %s:%s' % (masterHost, master.getPort())
- </message>
- <!-- Initialise the servers in the topology -->
- <call function="'initializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'sourceInstanceHost' : masterHost,
- 'sourceInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : [synchroSuffix]
- }
- </call>
-
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
- </script>
- <!-- Search for entry add -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <message>
- '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
- (replServer.getHostname(), replServer.getPort(), searchResult)
- </message>
- </sequence>
- </paralleliterate>
-
- <!-- Add entry to "master" server -->
- <message>
- '+++++ resynchronization add server: add entry to %s:%s' \
- % (masterHost, master.getPort())
- </message>
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
- % clientDataDir
- }
- </call>
-
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
- </script>
- <!-- Search for entry add -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <message>
- '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
- (replServer.getHostname(), replServer.getPort(), searchResult)
- </message>
- </sequence>
- </paralleliterate>
-
- <!-- Add new server to topology -->
- <script>
- if master.isOnlyLdapServer():
- masterReplPort = None
- else:
- masterReplPort = masterReplicationServer.getPort()
-
- if server3.isOnlyLdapServer():
- server3ReplPort = None
- else:
- replicationServer3 = server3.getChangelogServer()
- server3ReplPort = replicationServer3.getPort()
- </script>
-
- <message>
- '+++++ resynchronization add server: Enable replication for \
- server:\nHost: %s\nLdap port: %s\nReplication port: %s\n\
- Replicated DN list: %s' \
- % (server3.getHostname(), server3.getPort(),
- server3ReplPort, [synchroSuffix])
- </message>
-
- <call function="'enableReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'refInstanceHost' : masterHost,
- 'refInstanceAdminPort' : master.getAdminPort(),
- 'refInstanceDn' : master.getRootDn(),
- 'refInstancePswd' : master.getRootPwd(),
- 'refReplicationPort' : masterReplPort,
- 'refOnlyLdapServer' : master.isOnlyLdapServer(),
- 'refOnlyReplServer' : master.isOnlyReplServer(),
- 'dsInstanceHost' : server3.getHostname(),
- 'dsInstanceAdminPort' : server3.getAdminPort(),
- 'dsInstanceDn' : server3.getRootDn(),
- 'dsInstancePswd' : server3.getRootPwd(),
- 'dsReplicationPort' : server3ReplPort,
- 'dsOnlyLdapServer' : server3.isOnlyLdapServer(),
- 'dsOnlyReplServer' : server3.isOnlyReplServer(),
- 'replicationDnList' : [synchroSuffix]
- }
- </call>
+ </catch>
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
- <script>
- # Add 3rd server to replicated servers list now that replication
- # has been enabled on the 3rd one
- _topologyServerList = _topologyServerList + [server3]
- _splitServerList = _splitServerList + [server3]
- consumerList = consumerList + [server3]
- </script>
-
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
- </script>
- <!-- Search for entry add -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <message>
- '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
- (replServer.getHostname(), replServer.getPort(), searchResult)
- </message>
- </sequence>
- </paralleliterate>
-
- <!-- Copy backup to new server and restore it -->
- <script>
- server3BackupDir = '%s' % server3.getTmpDir()
- </script>
- <call function="'CopyFolderByExtension'">
- { 'location' : masterHost,
- 'remotehost' : server3.getHostname(),
- 'srcfolder' : '%s/replication/master_backup_%s' \
- % (masterBackupDir,m.hexdigest()),
- 'destfolder' : '%s/replication/master_backup_%s' \
- % (server3BackupDir,m.hexdigest()),
- 'extension' : '*'
- }
- </call>
+ </try>
- <message>
- '+++++ resynchronization add server: restore back-up on %s:%s'\
- % (server3.getHostname(), server3.getPort())
- </message>
- <call function="'restoreTask'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server3.getHostname(),
- 'dsInstancePort' : server3.getPort(),
- 'dsInstanceDn' : server3.getRootDn(),
- 'dsInstancePswd' : server3.getRootPwd(),
- 'taskID' : 'restore task - tc3',
- 'backupDir' : '%s/replication/master_backup_%s' \
- % (server3BackupDir,m.hexdigest())
- }
- </call>
-
- <paralleliterate var="server"
- in="_topologyServerList"
- indexvar="i">
- <sequence>
- <script>
- if globalSplitServers:
- replServer = _topologyReplServerList[i]
- else:
- replServer = server
- </script>
- <!-- Search for entry add -->
- <call function="'ldapSearchWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : replServer.getHostname(),
- 'dsInstancePort' : replServer.getPort(),
- 'dsInstanceDn' : replServer.getRootDn(),
- 'dsInstancePswd' : replServer.getRootPwd(),
- 'dsBaseDN' : 'dc=replicationChanges',
- 'dsFilter' : 'uid=*'
- }
- </call>
- <script>
- searchRC = STAXResult[0][0]
- searchResult = STAXResult[0][1]
- resultLength = len(searchResult) > 0
- </script>
- <message>
- '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
- (replServer.getHostname(), replServer.getPort(), searchResult)
- </message>
- </sequence>
- </paralleliterate>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <!-- If the trees don't match, we may have come across Issue 4052
- (Ghost adds in Replication Server) -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication Resync' }
- </call>
+ </sequence>
- <call function="'testSuite_Postamble'"/>
- </sequence>
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </finally>
+
+ </try>
</block>
</sequence>
</function>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization_tests.xml
new file mode 100644
index 0000000..1cf7fcb
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization_tests.xml
@@ -0,0 +1,897 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2007-2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!--- Test Case information
+ #@TestMarker Replication Re-Synchronization Tests
+ #@TestName Replication: Re-Synchronization: Preamble
+ #@TestID Preamble
+ #@TestPurpose Remove and disable 3rd server
+ #@TestPreamble None
+ #@TestSteps Disable 3rd server
+ #@TestPostamble None
+ #@TestResult None
+ -->
+ <function name="replication_resync_001" scope="local">
+ <testcase name="getTestCaseName('Resync Preamble')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Disable replication on 3rd server.' % msg1 }
+ </call>
+
+ <!-- Remove 3rd server from replication topology (i.e. disable
+ replication) -->
+ <call function="'disableReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server3.getHostname(),
+ 'dsInstanceAdminPort' : server3.getAdminPort(),
+ 'disableAll' : True
+ }
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication Re-Synchronization Tests
+ #@TestName Replication: Re-Synchronization: Off-line
+ initialisation
+ #@TestID Off-line initialisation
+ #@TestPurpose Initialise replicated servers using off-line
+ backup/restore
+ #@TestPreamble Back-up server A
+ #@TestSteps Add entry on server A
+ #@TestSteps Stop servers
+ #@TestSteps Restore back-up on other servers
+ #@TestSteps Start servers
+ #@TestPostamble
+ #@TestResult Success if trees synchronized
+ -->
+ <function name="replication_resync_002" scope="local">
+ <testcase name="getTestCaseName('Off-line initialisation')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialise replicated servers using off-line backup/restore.' % msg1 }
+ </call>
+
+ <script>
+ m = md5_hash()
+ m.update(STAXCurrentTestcase)
+ </script>
+
+ <!-- Backup "master" server -->
+ <message>
+ '+++++ binary copy off-line: back-up server %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'backup'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest())
+ }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <message>
+ '+++++ resynchronization off-line: add entry to %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
+ % clientDataDir
+ }
+ </call>
+
+ <!-- Stop the "consumer" servers -->
+ <call function="'stopServers'">
+ [consumerList]
+ </call>
+
+ <!-- Copy master backup to "consumer" servers and restore it -->
+ <paralleliterate var="consumer" in="consumerList">
+ <sequence>
+ <script>
+ consumerBackupDir = '%s' % consumer.getTmpDir()
+ </script>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : masterHost,
+ 'remotehost' : consumer.getHostname(),
+ 'srcfolder' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest()),
+ 'destfolder' : '%s/replication/master_backup_%s' \
+ % (consumerBackupDir,m.hexdigest()),
+ 'extension' : '*'
+ }
+ </call>
+
+ <message>
+ '+++++ resynchronization off-line: restore backup on %s:%s'\
+ % (consumer.getHostname(), consumer.getPort())
+ </message>
+ <call function="'restore'">
+ { 'location' : consumer.getHostname(),
+ 'dsPath' : '%s/%s' % (consumer.getDir(), OPENDSNAME),
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (consumerBackupDir,m.hexdigest())
+ }
+ </call>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Start the "consumer" servers -->
+ <call function="'startServers'">
+ [consumerList]
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication Re-Synchronization Tests
+ #@TestName Replication: Re-Synchronization: On-line
+ initialisation
+ #@TestID On-line initialisation
+ #@TestPurpose Initialise replicated servers using on-line
+ backup/restore
+ #@TestPreamble
+ #@TestSteps Call dsreplication pre-external-initialization
+ #@TestSteps Import data on server A
+ #@TestSteps Back-up server A
+ #@TestSteps Call dsreplication post-external-initialization
+ #@TestSteps Add entry on server A
+ #@TestSteps Restore back-up on other servers
+ #@TestPostamble
+ #@TestResult Success if trees synchronized
+ -->
+ <function name="replication_resync_003" scope="local">
+ <testcase name="getTestCaseName('On-line initialisation')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialise replicated servers using on-line backup/restore.' % msg1 }
+ </call>
+
+ <script>
+ m = md5_hash()
+ m.update(STAXCurrentTestcase)
+ </script>
+
+ <!-- Pre-initialise the servers in the topology -->
+ <message>
+ '+++++ resynchronization on-line: prepare servers for external \
+ initialization'
+ </message>
+ <call function="'preInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'localOnly' : False,
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Import data into "master" server -->
+ <message>
+ '+++++ resynchronization on-line: import data on %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'ImportLdifWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'ldifFile' : '%s/replication/Example.ldif' \
+ % masterDataDir
+ }
+ </call>
+
+ <!-- Check some data was imported into "master" server -->
+ <call function="'checkImport'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsHost' : masterHost,
+ 'dsPort' : master.getPort(),
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsDn' : master.getRootDn(),
+ 'dsPswd' : master.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=rhunt, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+
+ <!-- Backup "master" server -->
+ <message>
+ '+++++ resynchronization on-line: back-up server %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'backupTask'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'taskID' : 'backup task - tc2',
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest())
+ }
+ </call>
+
+ <!-- Post-initialise the servers in the topology -->
+ <message>
+ '+++++ resynchronization on-line: end external server \
+ initialization'
+ </message>
+ <call function="'postInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Add entry to "master" server -->
+ <message>
+ '+++++ resynchronization on-line: add entry to %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
+ % clientDataDir
+ }
+ </call>
+
+ <!-- Copy backup to "consumer" servers and restore it -->
+ <paralleliterate var="consumer" in="consumerList">
+ <sequence>
+ <script>
+ consumerBackupDir = '%s' % consumer.getTmpDir()
+ </script>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : masterHost,
+ 'remotehost' : consumer.getHostname(),
+ 'srcfolder' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest()),
+ 'destfolder' : '%s/replication/master_backup_%s' \
+ % (consumerBackupDir,m.hexdigest()),
+ 'extension' : '*'
+ }
+ </call>
+
+ <message>
+ '+++++ resynchronization on-line: restore back-up on %s:%s'\
+ % (consumer.getHostname(), consumer.getPort())
+ </message>
+ <call function="'restoreTask'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumer.getHostname(),
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'taskID' : 'restore task - tc2',
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (consumerBackupDir,m.hexdigest())
+ }
+ </call>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Re-Synchronization Tests
+ #@TestName Replication: Re-Synchronization: Add new server
+ #@TestID Add new server
+ #@TestPurpose Initialise newly added replicated server
+ using on-line backup/restore
+ #@TestPreamble
+ #@TestSteps Call dsreplication pre-external-initialization
+ #@TestSteps Import data on server A
+ #@TestSteps Back-up server A
+ #@TestSteps Initialise other servers from server A
+ #@TestSteps Add entry on server A
+ #@TestSteps Add server: enable replication
+ #@TestSteps Restore back-up on new server
+ #@TestPostamble
+ #@TestResult Success if trees synchronized
+ -->
+ <function name="replication_resync_004" scope="local">
+ <testcase name="getTestCaseName('Add new Server')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialise newly added server using on-line backup/restore.' % msg1 }
+ </call>
+
+ <script>
+ m = md5_hash()
+ m.update(STAXCurrentTestcase)
+ </script>
+
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+ </script>
+ <!-- Search for entry add -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <message>
+ '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
+ (replServer.getHostname(), replServer.getPort(), searchResult)
+ </message>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Pre-initialise the servers in the topology -->
+ <message>
+ '+++++ resynchronization add server: prepare servers for \
+ external initialization'
+ </message>
+ <call function="'preInitializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'localOnly' : False,
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+ </script>
+ <!-- Search for entry add -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <message>
+ '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
+ (replServer.getHostname(), replServer.getPort(), searchResult)
+ </message>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Import data into "master" server -->
+ <message>
+ '+++++ resynchronization add server: import data on %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'ImportLdifWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'ldifFile' : '%s/replication/Example.ldif' \
+ % masterDataDir
+ }
+ </call>
+
+ <!-- Check some data was imported into "master" server -->
+ <call function="'checkImport'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsHost' : masterHost,
+ 'dsPort' : master.getPort(),
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsDn' : master.getRootDn(),
+ 'dsPswd' : master.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=rhunt, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+
+ <!-- Backup "master" server -->
+ <message>
+ '+++++ resynchronization add server: back-up server %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'backupTask'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'taskID' : 'backup task - tc3',
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest())
+ }
+ </call>
+
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+ </script>
+ <!-- Search for entry add -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <message>
+ '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
+ (replServer.getHostname(), replServer.getPort(), searchResult)
+ </message>
+ </sequence>
+ </paralleliterate>
+
+ <message>
+ '+++++ resynchronization add server: Initialise topology from \
+ %s:%s' % (masterHost, master.getPort())
+ </message>
+ <!-- Initialise the servers in the topology -->
+ <call function="'initializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'sourceInstanceHost' : masterHost,
+ 'sourceInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : [synchroSuffix]
+ }
+ </call>
+
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+ </script>
+ <!-- Search for entry add -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <message>
+ '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
+ (replServer.getHostname(), replServer.getPort(), searchResult)
+ </message>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Add entry to "master" server -->
+ <message>
+ '+++++ resynchronization add server: add entry to %s:%s' \
+ % (masterHost, master.getPort())
+ </message>
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/tfitter.ldif' \
+ % clientDataDir
+ }
+ </call>
+
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+ </script>
+ <!-- Search for entry add -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <message>
+ '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
+ (replServer.getHostname(), replServer.getPort(), searchResult)
+ </message>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Add new server to topology -->
+ <script>
+ if master.isOnlyLdapServer():
+ masterReplPort = None
+ else:
+ masterReplPort = masterReplicationServer.getPort()
+
+ if server3.isOnlyLdapServer():
+ server3ReplPort = None
+ else:
+ replicationServer3 = server3.getChangelogServer()
+ server3ReplPort = replicationServer3.getPort()
+ </script>
+
+ <message>
+ '+++++ resynchronization add server: Enable replication for \
+ server:\nHost: %s\nLdap port: %s\nReplication port: %s\n\
+ Replicated DN list: %s' \
+ % (server3.getHostname(), server3.getPort(),
+ server3ReplPort, [synchroSuffix])
+ </message>
+
+ <call function="'enableReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'refInstanceHost' : masterHost,
+ 'refInstanceAdminPort' : master.getAdminPort(),
+ 'refInstanceDn' : master.getRootDn(),
+ 'refInstancePswd' : master.getRootPwd(),
+ 'refReplicationPort' : masterReplPort,
+ 'refOnlyLdapServer' : master.isOnlyLdapServer(),
+ 'refOnlyReplServer' : master.isOnlyReplServer(),
+ 'dsInstanceHost' : server3.getHostname(),
+ 'dsInstanceAdminPort' : server3.getAdminPort(),
+ 'dsInstanceDn' : server3.getRootDn(),
+ 'dsInstancePswd' : server3.getRootPwd(),
+ 'dsReplicationPort' : server3ReplPort,
+ 'dsOnlyLdapServer' : server3.isOnlyLdapServer(),
+ 'dsOnlyReplServer' : server3.isOnlyReplServer(),
+ 'replicationDnList' : [synchroSuffix]
+ }
+ </call>
+
+
+ <script>
+ # Add 3rd server to replicated servers list now that replication
+ # has been enabled on the 3rd one
+ _topologyServerList = _topologyServerList + [server3]
+ _splitServerList = _splitServerList + [server3]
+ consumerList = consumerList + [server3]
+ </script>
+
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+ </script>
+ <!-- Search for entry add -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <message>
+ '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
+ (replServer.getHostname(), replServer.getPort(), searchResult)
+ </message>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Copy backup to new server and restore it -->
+ <script>
+ server3BackupDir = '%s' % server3.getTmpDir()
+ </script>
+ <call function="'CopyFolderByExtension'">
+ { 'location' : masterHost,
+ 'remotehost' : server3.getHostname(),
+ 'srcfolder' : '%s/replication/master_backup_%s' \
+ % (masterBackupDir,m.hexdigest()),
+ 'destfolder' : '%s/replication/master_backup_%s' \
+ % (server3BackupDir,m.hexdigest()),
+ 'extension' : '*'
+ }
+ </call>
+
+ <message>
+ '+++++ resynchronization add server: restore back-up on %s:%s'\
+ % (server3.getHostname(), server3.getPort())
+ </message>
+ <call function="'restoreTask'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server3.getHostname(),
+ 'dsInstancePort' : server3.getPort(),
+ 'dsInstanceDn' : server3.getRootDn(),
+ 'dsInstancePswd' : server3.getRootPwd(),
+ 'taskID' : 'restore task - tc3',
+ 'backupDir' : '%s/replication/master_backup_%s' \
+ % (server3BackupDir,m.hexdigest())
+ }
+ </call>
+
+ <paralleliterate var="server"
+ in="_topologyServerList"
+ indexvar="i">
+ <sequence>
+ <script>
+ if globalSplitServers:
+ replServer = _topologyReplServerList[i]
+ else:
+ replServer = server
+ </script>
+ <!-- Search for entry add -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'dc=replicationChanges',
+ 'dsFilter' : 'uid=*'
+ }
+ </call>
+ <script>
+ searchRC = STAXResult[0][0]
+ searchResult = STAXResult[0][1]
+ resultLength = len(searchResult) > 0
+ </script>
+ <message>
+ '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
+ (replServer.getHostname(), replServer.getPort(), searchResult)
+ </message>
+ </sequence>
+ </paralleliterate>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <!-- If the trees don't match, we may have come across Issue 4052
+ (Ghost adds in Replication Server) -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml
index 5277922..4063ffc 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml
@@ -7,1050 +7,153 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2007-2008 Sun Microsystems, Inc.
- ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
-
<defaultcall function="replication_schema"/>
-
- <function name="replication_schema">
-
+ <function name="replication_schema" scope="local">
<sequence>
+ <block name="'replication_schema'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'schema'
+
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication Schema'
+ </script>
- <block name="'schema'">
+ <!--- Test Suite information
+ #@TestSuiteName Replication Schema Tests
+ #@TestSuitePurpose Verify that the total-update operations are replicated
+ correctly between two servers.
+ #@TestSuiteID Schema Tests
+ #@TestSuiteGroup Schema
+ #@TestGroup Replication
+ #@TestScript replication_schema.xml
+ #@TestHTMLLink http://www.forgerock.org/
+ -->
+
+ <call function="'testSuite_Preamble'"/>
- <sequence>
-
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication Schema Replication Tests
- #@TestSuitePurpose Verify that the schema is replicated as any
- other suffix in a replicated topology.
- #@TestSuiteID Schema Replication Tests
- #@TestSuiteGroup Schema Replication
- #@TestGroup Replication
- #@TestScript replication_schema.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
+ <try>
+ <sequence>
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml' % TESTS_DIR"/>
- <call function="'replication_setup'" >
- { 'label' : 'Replication Schema' }
- </call>
-
- <script>
- synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
-
- currentSchemaFile = '%s/config/schema/99-user.ldif' % masterPath
- provSchemaFile = '%s/../last-99-user.ldif' % masterPath
-
- consumer = consumerList[0]
- consumerHost = consumer.getHostname()
-
- msg1 = 'Replication: Schema:'
- </script>
-
-
- <!--- Test Case information
- #@TestMarker Replication Schema Replication Tests
- #@TestName Replication: Schema Replication: Add objectclass
- #@TestID Add objectclass
- #@TestPurpose Check schema replication when a new objectclass
- is added
- #@TestPreamble Load entries
- #@TestSteps Add new objectclass definition on server1
- #@TestSteps Add entry of new objectclass on server2
- #@TestPostamble
- #@TestResult Success if schema add and entry add replicated
- -->
- <testcase name="getTestCaseName('Add objectclass')">
- <sequence>
- <call function="'testCase_Preamble'"/>
-
- <message>
- 'Test Name = %s' % STAXCurrentTestcase
- </message>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'" >
+ { 'label' : _label }
+ </call>
- <message>
- '%s Add objectclass. Check schema replication when a new objectclass is added' % msg1
- </message>
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('schema/schema_tests')
+ </script>
- <call function="'testStep'">
- { 'stepMessage' : '%s Load entries into "master" server.' % msg1 }
- </call>
-
- <!-- Load entries into "master" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/Example.ldif' % \
- clientDataDir
- }
- </call>
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
- <call function="'testStep'">
- { 'stepMessage' : '%s Add new object class.' % msg1 }
- </call>
-
- <script>
- newObjectclass = '( testobjectclass-oid NAME \'testobjectclass-0\' SUP person MAY ( street $ c ) X-ORIGIN \'user defined\' )'
- </script>
-
- <!-- Modify schema in "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'cn=schema',
- 'attributeName' : 'objectClasses',
- 'newAttributeValue' : newObjectclass,
- 'changetype' : 'add'
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Add entry to "consumer" server using new objectclass.' % msg1 }
- </call>
-
- <!-- Add entry to "consumer" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumerHost,
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/testuser-0.ldif' % \
- clientDataDir
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the schema among the servers
- in the topology -->
- <call function="'verifySchemas'">
- [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Schema Replication Tests
- #@TestName Replication: Schema Replication:
- Add attributetype
- #@TestID Add attributetype
- #@TestPurpose Check schema replication when a new
- attributetype is added
- #@TestPreamble
- #@TestSteps Add new attributeType and new objectclass
- definition on server1
- #@TestSteps Add new entry containing new objectclass and
- new attributeType on server2
- #@TestPostamble
- #@TestResult Success if schema add and entry adds replicated
- -->
- <testcase name="getTestCaseName('Add attributetype')">
- <sequence>
- <call function="'testCase_Preamble'"/>
-
- <message>
- '%s Add Attributetype. schema replication when a new Attributetype is added' % msg1
- </message>
-
- <script>
- newObjectclass = '( testobjectclass1-oid NAME \'testobjectclass-1\' SUP person MAY ( street $ testattribute-1 $ c ) X-ORIGIN \'user defined\' )'
- newAttributetype = '( testattribute1-oid NAME \'testattribute-1\' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN \'user defined\' )'
- </script>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Add newAttributetype in "master" server.' % msg1 }
- </call>
-
- <!-- Modify schema in "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'cn=schema',
- 'attributeName' : 'attributeTypes',
- 'newAttributeValue' : newAttributetype,
- 'changetype' : 'add'
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Add newObjectclass in "master" server.' % msg1 }
- </call>
-
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'cn=schema',
- 'attributeName' : 'objectClasses',
- 'newAttributeValue' : newObjectclass,
- 'changetype' : 'add'
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Add entry to "consumer" server.' % msg1 }
- </call>
-
- <!-- Add entry to "consumer" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumerHost,
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/testuser-1.ldif' % \
- clientDataDir
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the schema among the servers in
- the topology -->
- <call function="'verifySchemas'">
- [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!-- Test Case information
- #@TestMarker Replication Schema Replication Tests
- #@TestName Replication: Schema Replication:
- Delete objectclass
- #@TestID Delete objectclass
- #@TestPurpose Check schema replication when an objectclass
- is deleted
- #@TestPreamble
- #@TestSteps Remove user-defined objectclass definition on
- server1
- #@TestSteps Delete entry on server1
- #@TestSteps Add entry containing removed objectclass on
- every server
- #@TestPostamble
- #@TestResult Success if schema remove replicated and last
- entry add rejected on all servers (error 65:
- objectclass violation)
- -->
- <testcase name="getTestCaseName('Delete objectclass')">
- <sequence>
- <call function="'testCase_Preamble'"/>
-
- <message>
- 'Test Name = %s' % STAXCurrentTestcase
- </message>
-
- <message>
- '%s Delete objectclass. Check schema replication when an objectclass is deleted' % msg1
- </message>
-
- <script>
- newObjectclass = '( testobjectclass-oid NAME \'testobjectclass-0\' SUP person MAY ( street $ c ) X-ORIGIN \'user defined\' )'
- </script>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Delete newObjectclass in "master" server.' % msg1 }
- </call>
-
- <!-- Modify schema in "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'cn=schema',
- 'attributeName' : 'objectClasses',
- 'newAttributeValue' : newObjectclass,
- 'changetype' : 'delete'
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Delete previously added entry.' % msg1 }
- </call>
-
- <!-- Delete previously added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : master.getHostname(),
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsDn' : ['cn=testuser-0,ou=People,%s' % synchroSuffix]
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Attempt to add entry to servers with deleted objectclass.' % msg1 }
- </call>
-
- <!-- Try to add entry to servers; should be rejected with error 65
- (objectclass violation) -->
- <iterate var="server" in="_topologyServerList">
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/testuser-0.ldif' % \
- clientDataDir,
- 'expectedRC' : 65
- }
- </call>
- </iterate>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the schema among the servers in
- the topology -->
- <call function="'verifySchemas'">
- [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!-- Test Case information
- #@TestMarker Replication Schema Replication Tests
- #@TestName Replication: Schema Replication:
- Modify objectclass
- #@TestID Modify objectclass
- #@TestPurpose Check schema replication when an objectclass is
- modified
- #@TestPreamble
- #@TestSteps Remove user-defined objectclass definition on
- server1
- #@TestSteps Add modified version of removed user-defined
- objectclass on server1 (make attributes
- MANDATORY)
- #@TestSteps Add entry containing newly added objectclass but
- without required attributes on every server
- #@TestPostamble
- #@TestResult Success if schema modify replicated and entry
- add rejected with error 65 (objectclass
- violation) on all servers
- -->
- <testcase name="getTestCaseName('Modify objectclass')">
- <sequence>
- <call function="'testCase_Preamble'"/>
-
- <message>
- 'Test Name = %s' % STAXCurrentTestcase
- </message>
-
- <message>
- '%s Modify objectclass. Check schema replication when an objectclass is modified' % msg1
- </message>
-
- <script>
- oldObjectclass = '( testobjectclass1-oid NAME \'testobjectclass-1\' SUP person MAY ( street $ testattribute-1 $ c ) X-ORIGIN \'user defined\' )'
- newObjectclass = '( testobjectclass1-oid NAME \'testobjectclass-1\' SUP person MUST ( street $ testattribute-1 $ c ) X-ORIGIN \'user defined\' )'
- </script>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Delete oldObjectclass in "master" server.' % msg1 }
- </call>
-
- <!-- Modify schema in "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'cn=schema',
- 'attributeName' : 'objectClasses',
- 'newAttributeValue' : oldObjectclass,
- 'changetype' : 'delete'
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Add newObjectclass in "master" server.' % msg1 }
- </call>
-
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'cn=schema',
- 'attributeName' : 'objectClasses',
- 'newAttributeValue' : newObjectclass,
- 'changetype' : 'add'
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Attempt to add entry to servers with deleted objectclass.' % msg1 }
- </call>
-
- <!-- Try to add entry to servers; should be rejected with error 65
- (objectclass violation) -->
- <iterate var="server" in="_topologyServerList">
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/testuser-2.ldif' % \
- clientDataDir,
- 'expectedRC' : 65
- }
- </call>
- </iterate>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the schema among the servers in
- the topology -->
- <call function="'verifySchemas'">
- [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Schema Replication Tests
- #@TestName Replication: Schema Replication: Add objectclass
- (edit schema file)
- #@TestID Add objectclass (edit schema file)
- #@TestPurpose Check schema replication when a new objectclass
- is added manually
- #@TestPreamble
- #@TestSteps Stop servers
- #@TestSteps Edit 99-user.ldif to add new objectclass
- definition on server1
- #@TestSteps Start servers
- #@TestSteps Add entry of new objectclass on server2
- #@TestPostamble
- #@TestResult Success if schema add and entry add replicated
- -->
- <testcase name="getTestCaseName
- ('Add objectclass (edit schema file)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
-
- <message>
- 'Test Name = %s' % STAXCurrentTestcase
- </message>
-
- <message>
- '%s Add objectclass. (edit schema file). \
- Check schema replication when a new objectclass \
- is added manually ' % msg1
- </message>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
- </call>
-
- <!-- Stop the servers in the topology -->
- <call function="'stopServers'">
- [_topologyServerList]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Modify schema in "master" server.' % msg1 }
- </call>
-
- <!-- Modify schema in "master" server -->
- <call function="'copyFile'">
- { 'location' : masterHost,
- 'remotehost' : masterHost,
- 'srcfile' : currentSchemaFile,
- 'destfile' : provSchemaFile
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Edit schema file.' % msg1 }
- </call>
-
- <call function="'LdifModifyWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'sourceLdif' : provSchemaFile,
- 'changesLdif' : '%s/replication/schemamods-0.ldif' % \
- masterDataDir,
- 'targetLdif' : currentSchemaFile
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
- </call>
-
- <!-- Start the servers in the topology -->
- <call function="'startServers'">
- [_topologyServerList]
- </call>
-
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 1000 }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Add entry to "consumer" server.' % msg1 }
- </call>
-
- <!-- Add entry to "consumer" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumerHost,
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/newtestuser-0.ldif' % \
- clientDataDir,
- 'knownIssue' : 'OPENDJ-452'
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the schema among the servers in
- the topology -->
- <call function="'verifySchemas'">
- [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Schema Replication Tests
- #@TestName Replication: Schema Replication: Add
- attributetype (edit schema file)
- #@TestID Add attributetype (edit schema file)
- #@TestPurpose Check schema replication when a new
- attributetype is added manually
- #@TestPreamble
- #@TestSteps Stop servers
- #@TestSteps Edit 99-user.ldif to add new objectclass and
- new attributeType definition on server1
- #@TestSteps Start servers
- #@TestSteps Add new entry containing new objectclass and
- new attributeType on server2
- #@TestPostamble
- #@TestResult Success if schema add and entry adds replicated
- -->
- <testcase name="getTestCaseName
- ('Add attributetype (edit schema file)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Schema Replication: Add attributetype (edit \
- schema file). Check schema replication when a new \
- attributetype is added manually'
- </message>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
- </call>
-
- <!-- Stop the servers in the topology -->
- <call function="'stopServers'">
- [_topologyServerList]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Modify schema in "master" server .' % msg1 }
- </call>
-
- <!-- Modify schema in "master" server -->
- <call function="'copyFile'">
- { 'location' : masterHost,
- 'remotehost' : masterHost,
- 'srcfile' : currentSchemaFile,
- 'destfile' : provSchemaFile
- }
- </call>
- <call function="'LdifModifyWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'sourceLdif' : provSchemaFile,
- 'changesLdif' : '%s/replication/schemamods-1.ldif' % \
- masterDataDir,
- 'targetLdif' : currentSchemaFile
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Start the servers in the topology.' % msg1 }
- </call>
-
- <!-- Start the servers in the topology -->
- <call function="'startServers'">
- [_topologyServerList]
- </call>
-
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 1000 }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Add entry to "consumer" server.' % msg1 }
- </call>
-
- <!-- Add entry to "consumer" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumerHost,
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/newtestuser-1.ldif' % \
- clientDataDir,
- 'knownIssue' : 'OPENDJ-452'
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the schema among the servers in
- the topology -->
- <call function="'verifySchemas'">
- [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
-
- <!-- Test Case information
- #@TestMarker Replication Schema Replication Tests
- #@TestName Replication: Schema Replication: Delete
- objectclass (edit schema file)
- #@TestID Delete objectclass (edit schema file)
- #@TestPurpose Check schema replication when an objectclass is
- deleted manually
- #@TestPreamble
- #@TestSteps Stop servers
- #@TestSteps Edit 99-user.ldif to remove user-defined
- objectclass definition on server1
- #@TestSteps Start servers
- #@TestSteps Delete entry on server1
- #@TestSteps Add entry containing removed objectclass on
- every server
- #@TestPostamble
- #@TestResult Success if schema remove replicated and last
- entry add rejected on all servers (error 65:
- objectclass violation)
- -->
- <testcase name="getTestCaseName
- ('Delete objectclass (edit schema file)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Schema Replication: Delete objectclass (edit \
- schema file). Check schema replication when an objectclass is \
- deleted manually'
- </message>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
- </call>
-
- <!-- Stop the servers in the topology -->
- <call function="'stopServers'">
- [_topologyServerList]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Modify schema in "master" server.' % msg1 }
- </call>
-
- <!-- Modify schema in "master" server -->
- <call function="'copyFile'">
- { 'location' : masterHost,
- 'remotehost' : masterHost,
- 'srcfile' : currentSchemaFile,
- 'destfile' : provSchemaFile
- }
- </call>
- <call function="'LdifModifyWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'sourceLdif' : provSchemaFile,
- 'changesLdif' : '%s/replication/schemamods-2.ldif' % \
- masterDataDir,
- 'targetLdif' : currentSchemaFile
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Start the servers in the topology.' % msg1 }
- </call>
-
- <!-- Start the servers in the topology -->
- <call function="'startServers'">
- [_topologyServerList]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Delete previously added entry.' % msg1 }
- </call>
-
- <!-- Delete previously added entry -->
- <call function="'ldapDeleteWithScript'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : master.getHostname(),
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'dsDn' : ['cn=newtestuser-0,ou=People,%s' % synchroSuffix],
- 'knownIssue' : 'OPENDJ-452'
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: Schema:'
+ synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
-
- }
- </call>
-
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 1000 }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Try to add entry to servers.' % msg1 }
- </call>
-
- <!-- Try to add entry to servers; should be rejected with error 65
- (objectclass violation) -->
- <!-- If the add doesn't return 65, it may mean we came across
- issue OPENDJ-453 (Manual schema objectclass delete not replicated) -->
- <iterate var="server" in="_topologyServerList">
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/newtestuser-0.ldif' % \
- clientDataDir,
- 'expectedRC' : 65,
- 'knownIssue' : 'OPENDJ-453'
- }
- </call>
- </iterate>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the schema among the servers in
- the topology -->
- <call function="'verifySchemas'">
- [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!-- Test Case information
- #@TestMarker Replication Schema Replication Tests
- #@TestName Replication: Schema Replication: Modify
- objectclass (edit schema file)
- #@TestID Modify objectclass (edit schema file)
- #@TestPurpose Check schema replication when an objectclass is
- modified manually
- #@TestPreamble
- #@TestSteps Stop servers
- #@TestSteps Edit 99-user.ldif to modify user-defined
- objectclass (make attributes MANDATORY) on
- server1
- #@TestSteps Start servers
- #@TestSteps Add entry containing newly added objectclass but
- without required attributes on every server
- #@TestPostamble
- #@TestResult Success if schema modify replicated and entry
- add rejected with error 65 (objectclass
- violation) on all servers
- -->
- <testcase name="getTestCaseName
- ('Modify objectclass (edit schema file)')">
- <sequence>
- <call function="'testCase_Preamble'"/>
- <message>
- 'Replication: Schema Replication: Modify objectclass (edit \
- schema file). Check schema replication when an objectclass is \
- modified manually'
- </message>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
- </call>
-
- <!-- Stop the servers in the topology -->
- <call function="'stopServers'">
- [_topologyServerList]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Modify schema in "master" server.' % msg1 }
- </call>
-
- <!-- Modify schema in "master" server -->
- <call function="'copyFile'">
- { 'location' : masterHost,
- 'remotehost' : masterHost,
- 'srcfile' : currentSchemaFile,
- 'destfile' : provSchemaFile
- }
- </call>
- <call function="'LdifModifyWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'sourceLdif' : provSchemaFile,
- 'changesLdif' : '%s/replication/schemamods-3.ldif' % \
- masterDataDir,
- 'targetLdif' : currentSchemaFile
- }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Start the servers in the topology.' % msg1 }
- </call>
-
- <!-- Start the servers in the topology -->
- <call function="'startServers'">
- [_topologyServerList]
- </call>
-
- <call function="'Sleep'">
- { 'sleepForMilliSeconds' : 1000 }
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Try to add entry to servers.' % msg1 }
- </call>
-
- <!-- Try to add entry to servers; should be rejected with error 65
- (objectclass violation) -->
- <!-- If the add doesn't return 65, it may mean we came across
- issue OPENDJ-453 (Manual schema objectclass delete not replicated) -->
- <iterate var="server" in="_topologyServerList">
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstancePort' : server.getPort(),
- 'dsInstanceDn' : server.getRootDn(),
- 'dsInstancePswd' : server.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/newtestuser-2.ldif' % \
- clientDataDir,
- 'expectedRC' : 65,
- 'knownIssue' : ['OPENDJ-453','OPENDJ-452']
- }
- </call>
- </iterate>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the schema among the servers in
- the topology -->
- <!-- Since this testcase inherits the 99-user.ldif from the one
- before, as long as OPENDJ-453 is still present, the schema files will
- differ as the second server will still have newobjectclass-0 -->
- <call function="'verifySchemas'">
- [ clientHost, clientPath, master, consumerList, '99-user.ldif',
- 'OPENDJ-453' ]
- </call>
-
- <call function="'testStep'">
- { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, synchroSuffix ]
- </call>
-
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml' % TESTS_DIR"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication Schema' }
- </call>
-
- <call function="'testSuite_Postamble'"/>
+ currentSchemaFile = '%s/config/schema/99-user.ldif' % masterPath
+ provSchemaFile = '%s/../last-99-user.ldif' % masterPath
- </sequence>
+ consumer = consumerList[0]
+ consumerHost = consumer.getHostname()
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_schema_001')
+ testsList.append('replication_schema_002')
+ testsList.append('replication_schema_003')
+ testsList.append('replication_schema_004')
+ testsList.append('replication_schema_005')
+ testsList.append('replication_schema_006')
+ testsList.append('replication_schema_007')
+ testsList.append('replication_schema_008')
+ </script>
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
+
+ </sequence>
+
+ <catch exception="'STAFException.TestSuite.SetupException'">
+ <sequence>
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
+ </message>
+ <rethrow/>
+ </sequence>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
+
+ </try>
+
+ </sequence>
+
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </finally>
+
+ </try>
</block>
-
</sequence>
-
</function>
-
</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema_tests.xml
new file mode 100644
index 0000000..85cac80
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema_tests.xml
@@ -0,0 +1,1131 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2007-2008 Sun Microsystems, Inc.
+ ! Portions Copyright 2011-2012 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!--- Test Case information
+ #@TestMarker Replication Schema Replication Tests
+ #@TestName Replication: Schema Replication: Add objectclass
+ #@TestID Add objectclass
+ #@TestPurpose Check schema replication when a new objectclass
+ is added
+ #@TestPreamble Load entries
+ #@TestSteps Add new objectclass definition on server1
+ #@TestSteps Add entry of new objectclass on server2
+ #@TestPostamble
+ #@TestResult Success if schema add and entry add replicated
+ -->
+ <function name="replication_schema_001" scope="local">
+ <testcase name="getTestCaseName('Add objectclass')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check schema replication when a new objectclass is added.' % msg1 }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Load entries into "master" server.' % msg1 }
+ </call>
+
+ <!-- Load entries into "master" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/Example.ldif' % \
+ clientDataDir
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Add new object class.' % msg1 }
+ </call>
+
+ <script>
+ newObjectclass = '( testobjectclass-oid NAME \'testobjectclass-0\' SUP person MAY ( street $ c ) X-ORIGIN \'user defined\' )'
+ </script>
+
+ <!-- Modify schema in "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'cn=schema',
+ 'attributeName' : 'objectClasses',
+ 'newAttributeValue' : newObjectclass,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Add entry to "consumer" server using new objectclass.' % msg1 }
+ </call>
+
+ <!-- Add entry to "consumer" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumerHost,
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/testuser-0.ldif' % \
+ clientDataDir
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the schema among the servers
+ in the topology -->
+ <call function="'verifySchemas'">
+ [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Schema Replication Tests
+ #@TestName Replication: Schema Replication:
+ Add attributetype
+ #@TestID Add attributetype
+ #@TestPurpose Check schema replication when a new
+ attributetype is added
+ #@TestPreamble
+ #@TestSteps Add new attributeType and new objectclass
+ definition on server1
+ #@TestSteps Add new entry containing new objectclass and
+ new attributeType on server2
+ #@TestPostamble
+ #@TestResult Success if schema add and entry adds replicated
+ -->
+ <function name="replication_schema_002" scope="local">
+ <testcase name="getTestCaseName('Add attributetype')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check schema replication when a new Attributetype is added.' % msg1 }
+ </call>
+
+ <script>
+ newObjectclass = '( testobjectclass1-oid NAME \'testobjectclass-1\' SUP person MAY ( street $ testattribute-1 $ c ) X-ORIGIN \'user defined\' )'
+ newAttributetype = '( testattribute1-oid NAME \'testattribute-1\' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN \'user defined\' )'
+ </script>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Add newAttributetype in "master" server.' % msg1 }
+ </call>
+
+ <!-- Modify schema in "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'cn=schema',
+ 'attributeName' : 'attributeTypes',
+ 'newAttributeValue' : newAttributetype,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Add newObjectclass in "master" server.' % msg1 }
+ </call>
+
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'cn=schema',
+ 'attributeName' : 'objectClasses',
+ 'newAttributeValue' : newObjectclass,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Add entry to "consumer" server.' % msg1 }
+ </call>
+
+ <!-- Add entry to "consumer" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumerHost,
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/testuser-1.ldif' % \
+ clientDataDir
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the schema among the servers in
+ the topology -->
+ <call function="'verifySchemas'">
+ [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!-- Test Case information
+ #@TestMarker Replication Schema Replication Tests
+ #@TestName Replication: Schema Replication:
+ Delete objectclass
+ #@TestID Delete objectclass
+ #@TestPurpose Check schema replication when an objectclass
+ is deleted
+ #@TestPreamble
+ #@TestSteps Remove user-defined objectclass definition on
+ server1
+ #@TestSteps Delete entry on server1
+ #@TestSteps Add entry containing removed objectclass on
+ every server
+ #@TestPostamble
+ #@TestResult Success if schema remove replicated and last
+ entry add rejected on all servers (error 65:
+ objectclass violation)
+ -->
+ <function name="replication_schema_003" scope="local">
+ <testcase name="getTestCaseName('Delete objectclass')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check schema replication when an objectclass is deleted.' % msg1 }
+ </call>
+
+ <script>
+ newObjectclass = '( testobjectclass-oid NAME \'testobjectclass-0\' SUP person MAY ( street $ c ) X-ORIGIN \'user defined\' )'
+ </script>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Delete newObjectclass in "master" server.' % msg1 }
+ </call>
+
+ <!-- Modify schema in "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'cn=schema',
+ 'attributeName' : 'objectClasses',
+ 'newAttributeValue' : newObjectclass,
+ 'changetype' : 'delete'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Delete previously added entry.' % msg1 }
+ </call>
+
+ <!-- Delete previously added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : master.getHostname(),
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsDn' : ['cn=testuser-0,ou=People,%s' % synchroSuffix]
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Attempt to add entry to servers with deleted objectclass.' % msg1 }
+ </call>
+
+ <!-- Try to add entry to servers; should be rejected with error 65
+ (objectclass violation) -->
+ <iterate var="server" in="_topologyServerList">
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/testuser-0.ldif' % \
+ clientDataDir,
+ 'expectedRC' : 65
+ }
+ </call>
+ </iterate>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the schema among the servers in
+ the topology -->
+ <call function="'verifySchemas'">
+ [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!-- Test Case information
+ #@TestMarker Replication Schema Replication Tests
+ #@TestName Replication: Schema Replication:
+ Modify objectclass
+ #@TestID Modify objectclass
+ #@TestPurpose Check schema replication when an objectclass is
+ modified
+ #@TestPreamble
+ #@TestSteps Remove user-defined objectclass definition on
+ server1
+ #@TestSteps Add modified version of removed user-defined
+ objectclass on server1 (make attributes
+ MANDATORY)
+ #@TestSteps Add entry containing newly added objectclass but
+ without required attributes on every server
+ #@TestPostamble
+ #@TestResult Success if schema modify replicated and entry
+ add rejected with error 65 (objectclass
+ violation) on all servers
+ -->
+ <function name="replication_schema_004" scope="local">
+ <testcase name="getTestCaseName('Modify objectclass')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check schema replication when an objectclass is modified.' % msg1 }
+ </call>
+
+ <script>
+ oldObjectclass = '( testobjectclass1-oid NAME \'testobjectclass-1\' SUP person MAY ( street $ testattribute-1 $ c ) X-ORIGIN \'user defined\' )'
+ newObjectclass = '( testobjectclass1-oid NAME \'testobjectclass-1\' SUP person MUST ( street $ testattribute-1 $ c ) X-ORIGIN \'user defined\' )'
+ </script>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Delete oldObjectclass in "master" server.' % msg1 }
+ </call>
+
+ <!-- Modify schema in "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'cn=schema',
+ 'attributeName' : 'objectClasses',
+ 'newAttributeValue' : oldObjectclass,
+ 'changetype' : 'delete'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Add newObjectclass in "master" server.' % msg1 }
+ </call>
+
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'cn=schema',
+ 'attributeName' : 'objectClasses',
+ 'newAttributeValue' : newObjectclass,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Attempt to add entry to servers with deleted objectclass.' % msg1 }
+ </call>
+
+ <!-- Try to add entry to servers; should be rejected with error 65
+ (objectclass violation) -->
+ <iterate var="server" in="_topologyServerList">
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/testuser-2.ldif' % \
+ clientDataDir,
+ 'expectedRC' : 65
+ }
+ </call>
+ </iterate>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the schema among the servers in
+ the topology -->
+ <call function="'verifySchemas'">
+ [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Schema Replication Tests
+ #@TestName Replication: Schema Replication: Add objectclass
+ (edit schema file)
+ #@TestID Add objectclass (edit schema file)
+ #@TestPurpose Check schema replication when a new objectclass
+ is added manually
+ #@TestPreamble
+ #@TestSteps Stop servers
+ #@TestSteps Edit 99-user.ldif to add new objectclass
+ definition on server1
+ #@TestSteps Start servers
+ #@TestSteps Add entry of new objectclass on server2
+ #@TestPostamble
+ #@TestResult Success if schema add and entry add replicated
+ -->
+ <function name="replication_schema_005" scope="local">
+ <testcase name="getTestCaseName('Add objectclass (edit schema file)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check schema replication when a new objectclass is manually added.' % msg1 }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <call function="'stopServers'">
+ [_topologyServerList]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Modify schema in "master" server.' % msg1 }
+ </call>
+
+ <!-- Modify schema in "master" server -->
+ <call function="'copyFile'">
+ { 'location' : masterHost,
+ 'remotehost' : masterHost,
+ 'srcfile' : currentSchemaFile,
+ 'destfile' : provSchemaFile
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Edit schema file.' % msg1 }
+ </call>
+
+ <call function="'LdifModifyWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'sourceLdif' : provSchemaFile,
+ 'changesLdif' : '%s/replication/schemamods-0.ldif' % \
+ masterDataDir,
+ 'targetLdif' : currentSchemaFile
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Start the servers in the topology -->
+ <call function="'startServers'">
+ [_topologyServerList]
+ </call>
+
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 1000 }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Add entry to "consumer" server.' % msg1 }
+ </call>
+
+ <!-- Add entry to "consumer" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumerHost,
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/newtestuser-0.ldif' % \
+ clientDataDir,
+ 'knownIssue' : 'OPENDJ-452'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the schema among the servers in
+ the topology -->
+ <call function="'verifySchemas'">
+ [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Schema Replication Tests
+ #@TestName Replication: Schema Replication: Add
+ attributetype (edit schema file)
+ #@TestID Add attributetype (edit schema file)
+ #@TestPurpose Check schema replication when a new
+ attributetype is added manually
+ #@TestPreamble
+ #@TestSteps Stop servers
+ #@TestSteps Edit 99-user.ldif to add new objectclass and
+ new attributeType definition on server1
+ #@TestSteps Start servers
+ #@TestSteps Add new entry containing new objectclass and
+ new attributeType on server2
+ #@TestPostamble
+ #@TestResult Success if schema add and entry adds replicated
+ -->
+ <function name="replication_schema_006" scope="local">
+ <testcase name="getTestCaseName('Add attributetype (edit schema file)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check schema replication when a new attributetype is manually added.' % msg1 }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <call function="'stopServers'">
+ [_topologyServerList]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Modify schema in "master" server .' % msg1 }
+ </call>
+
+ <!-- Modify schema in "master" server -->
+ <call function="'copyFile'">
+ { 'location' : masterHost,
+ 'remotehost' : masterHost,
+ 'srcfile' : currentSchemaFile,
+ 'destfile' : provSchemaFile
+ }
+ </call>
+ <call function="'LdifModifyWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'sourceLdif' : provSchemaFile,
+ 'changesLdif' : '%s/replication/schemamods-1.ldif' % \
+ masterDataDir,
+ 'targetLdif' : currentSchemaFile
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Start the servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Start the servers in the topology -->
+ <call function="'startServers'">
+ [_topologyServerList]
+ </call>
+
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 1000 }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Add entry to "consumer" server.' % msg1 }
+ </call>
+
+ <!-- Add entry to "consumer" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumerHost,
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/newtestuser-1.ldif' % \
+ clientDataDir,
+ 'knownIssue' : 'OPENDJ-452'
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the schema among the servers in
+ the topology -->
+ <call function="'verifySchemas'">
+ [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+
+ <!-- Test Case information
+ #@TestMarker Replication Schema Replication Tests
+ #@TestName Replication: Schema Replication: Delete
+ objectclass (edit schema file)
+ #@TestID Delete objectclass (edit schema file)
+ #@TestPurpose Check schema replication when an objectclass is
+ deleted manually
+ #@TestPreamble
+ #@TestSteps Stop servers
+ #@TestSteps Edit 99-user.ldif to remove user-defined
+ objectclass definition on server1
+ #@TestSteps Start servers
+ #@TestSteps Delete entry on server1
+ #@TestSteps Add entry containing removed objectclass on
+ every server
+ #@TestPostamble
+ #@TestResult Success if schema remove replicated and last
+ entry add rejected on all servers (error 65:
+ objectclass violation)
+ -->
+ <function name="replication_schema_007" scope="local">
+ <testcase name="getTestCaseName('Delete objectclass (edit schema file)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check schema replication when a new objectclass is manually deleted.' % msg1 }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <call function="'stopServers'">
+ [_topologyServerList]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Modify schema in "master" server.' % msg1 }
+ </call>
+
+ <!-- Modify schema in "master" server -->
+ <call function="'copyFile'">
+ { 'location' : masterHost,
+ 'remotehost' : masterHost,
+ 'srcfile' : currentSchemaFile,
+ 'destfile' : provSchemaFile
+ }
+ </call>
+ <call function="'LdifModifyWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'sourceLdif' : provSchemaFile,
+ 'changesLdif' : '%s/replication/schemamods-2.ldif' % \
+ masterDataDir,
+ 'targetLdif' : currentSchemaFile
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Start the servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Start the servers in the topology -->
+ <call function="'startServers'">
+ [_topologyServerList]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Delete previously added entry.' % msg1 }
+ </call>
+
+ <!-- Delete previously added entry -->
+ <call function="'ldapDeleteWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : master.getHostname(),
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'dsDn' : ['cn=newtestuser-0,ou=People,%s' % synchroSuffix],
+ 'knownIssue' : 'OPENDJ-452'
+
+
+ }
+ </call>
+
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 1000 }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Try to add entry to servers.' % msg1 }
+ </call>
+
+ <!-- Try to add entry to servers; should be rejected with error 65
+ (objectclass violation) -->
+ <!-- If the add doesn't return 65, it may mean we came across
+ issue OPENDJ-453 (Manual schema objectclass delete not replicated) -->
+ <iterate var="server" in="_topologyServerList">
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/newtestuser-0.ldif' % \
+ clientDataDir,
+ 'expectedRC' : 65,
+ 'knownIssue' : 'OPENDJ-453'
+ }
+ </call>
+ </iterate>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the schema among the servers in
+ the topology -->
+ <call function="'verifySchemas'">
+ [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!-- Test Case information
+ #@TestMarker Replication Schema Replication Tests
+ #@TestName Replication: Schema Replication: Modify
+ objectclass (edit schema file)
+ #@TestID Modify objectclass (edit schema file)
+ #@TestPurpose Check schema replication when an objectclass is
+ modified manually
+ #@TestPreamble
+ #@TestSteps Stop servers
+ #@TestSteps Edit 99-user.ldif to modify user-defined
+ objectclass (make attributes MANDATORY) on
+ server1
+ #@TestSteps Start servers
+ #@TestSteps Add entry containing newly added objectclass but
+ without required attributes on every server
+ #@TestPostamble
+ #@TestResult Success if schema modify replicated and entry
+ add rejected with error 65 (objectclass
+ violation) on all servers
+ -->
+ <function name="replication_schema_008" scope="local">
+ <testcase name="getTestCaseName('Modify objectclass (edit schema file)')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Check schema replication when a new objectclass is manually modified.' % msg1 }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Stop the servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Stop the servers in the topology -->
+ <call function="'stopServers'">
+ [_topologyServerList]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Modify schema in "master" server.' % msg1 }
+ </call>
+
+ <!-- Modify schema in "master" server -->
+ <call function="'copyFile'">
+ { 'location' : masterHost,
+ 'remotehost' : masterHost,
+ 'srcfile' : currentSchemaFile,
+ 'destfile' : provSchemaFile
+ }
+ </call>
+ <call function="'LdifModifyWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'sourceLdif' : provSchemaFile,
+ 'changesLdif' : '%s/replication/schemamods-3.ldif' % \
+ masterDataDir,
+ 'targetLdif' : currentSchemaFile
+ }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Start the servers in the topology.' % msg1 }
+ </call>
+
+ <!-- Start the servers in the topology -->
+ <call function="'startServers'">
+ [_topologyServerList]
+ </call>
+
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : 1000 }
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Try to add entry to servers.' % msg1 }
+ </call>
+
+ <!-- Try to add entry to servers; should be rejected with error 65
+ (objectclass violation) -->
+ <!-- If the add doesn't return 65, it may mean we came across
+ issue OPENDJ-453 (Manual schema objectclass delete not replicated) -->
+ <iterate var="server" in="_topologyServerList">
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstancePort' : server.getPort(),
+ 'dsInstanceDn' : server.getRootDn(),
+ 'dsInstancePswd' : server.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/newtestuser-2.ldif' % \
+ clientDataDir,
+ 'expectedRC' : 65,
+ 'knownIssue' : ['OPENDJ-453','OPENDJ-452']
+ }
+ </call>
+ </iterate>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the schema on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the schema among the servers in
+ the topology -->
+ <!-- Since this testcase inherits the 99-user.ldif from the one
+ before, as long as OPENDJ-453 is still present, the schema files will
+ differ as the second server will still have newobjectclass-0 -->
+ <call function="'verifySchemas'">
+ [ clientHost, clientPath, master, consumerList, '99-user.ldif',
+ 'OPENDJ-453' ]
+ </call>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Verify the synchronization of the trees on all the servers.' % msg1 }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+</stax>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml
index e5cc13c..ff431db 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml
@@ -7,551 +7,141 @@
! Common Development and Distribution License, Version 1.0 only
! (the "License"). You may not use this file except in compliance
! with the License.
- !
+ !
! You can obtain a copy of the license at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
- ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
! See the License for the specific language governing permissions
! and limitations under the License.
- !
+ !
! When distributing Covered Code, include this CDDL HEADER in each
! file and include the License file at
- ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt. If applicable,
! add the following below this CDDL HEADER, with the fields enclosed
! by brackets "[]" replaced with your own identifying information:
! Portions Copyright [yyyy] [name of copyright owner]
!
! CDDL HEADER END
!
- ! Copyright 2007-2010 Sun Microsystems, Inc.
- ! Portions Copyright 2012 ForgeRock AS.
+ ! Copyright 2012 ForgeRock AS.
! -->
<stax>
<defaultcall function="replication_totalupdate"/>
- <function name="replication_totalupdate">
+ <function name="replication_totalupdate" scope="local">
<sequence>
- <block name="'total-update'">
- <sequence>
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication Total Update Tests
- #@TestSuitePurpose Verify that all the contents of a given suffix
- can be pushed in one shot from one server to
- other servers in the topology.
- #@TestSuiteID Total Update Tests
- #@TestSuiteGroup Total Update
- #@TestGroup Replication
- #@TestScript replication_totalupdate.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'" >
- { 'label' : 'Replication Totalupdate' }
- </call>
-
- <script>
- server1DataDir = '%s' % server1.getDataDir()
- </script>
-
- <!--- Test Case : Total Update -->
- <!--- Test Case information
- #@TestMarker Replication Total Update Tests
- #@TestName Replication: Total Update: Simple LDIF
- #@TestID Simple LDIF
- #@TestPurpose Initialize server with total update
- #@TestPreamble
- #@TestSteps Stop server A
- #@TestSteps Import data into server A
- #@TestSteps Start server A
- #@TestSteps Initialise (dsreplication initialize)
- every other server from server A
- #@TestSteps Check suffix has been initialised on every
- server
- #@TestSteps Add entry on server A
- #@TestPostamble
- #@TestResult Success if initialisation call succeeds for all
- servers and all servers are synchronised
- -->
- <testcase name="getTestCaseName('Simple LDIF')">
- <sequence>
-
- <call function="'testCase_Preamble'"/>
-
- <message>
- 'Replication: Total Update: Simple LDIF. Initialize server \
- with total update'
- </message>
+ <block name="'replication_totalupdate'">
+ <try>
+ <sequence>
+ <script>
+ CurrentTestPath['group'] = 'replication'
+ CurrentTestPath['suite'] = 'totalupdate'
- <!-- Stop "master" Directory Server -->
- <call function="'StopDsWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsHost' : masterHost,
- 'dsAdminPort' : master.getAdminPort(),
- 'dsBindDN' : master.getRootDn(),
- 'dsBindPwd' : master.getRootPwd()
- }
- </call>
-
- <!-- Check that the Directory Server is stopped -->
-
- <!-- Import data into "master" Directory Server -->
- <call function="'ImportLdifWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'backEnd' : DIRECTORY_INSTANCE_BE,
- 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir
- }
- </call>
-
- <!-- Start the Directory Server -->
- <call function="'StartDsWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath
- }
- </call>
-
- <!-- Wait for DS to start -->
- <call function="'isAlive'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'noOfLoops' : 10 ,
- 'noOfMilliSeconds' : 2000
- }
- </call>
-
- <!-- Check some data was imported into Directory Server -->
- <call function="'checkImport'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsHost' : masterHost,
- 'dsPort' : master.getPort(),
- 'dsAdminPort' : master.getAdminPort(),
- 'dsDn' : master.getRootDn(),
- 'dsPswd' : master.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=rhunt, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
+ _group=CurrentTestPath['group']
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ _label = 'Replication TotalUpdate'
+ </script>
-
- <iterate var="server" in="consumerList">
- <sequence>
- <!-- Perform the total update -->
- <call function="'initializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server.getHostname(),
- 'dsInstanceAdminPort' : server.getAdminPort(),
- 'sourceInstanceHost' : masterHost,
- 'sourceInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : ['o=example']
- }
- </call>
-
- <!-- Verify the total update -->
- <call function="'checkImport'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
- 'dsHost' : server.getHostname(),
- 'dsPort' : server.getPort(),
- 'dsAdminPort' : server.getAdminPort(),
- 'dsDn' : server.getRootDn(),
- 'dsPswd' : server.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=rhunt, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
- </sequence>
- </iterate>
-
- <!-- To make sure replication is working: add entry to "master"
- server -->
- <script>
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Professor Moriarty')
- listAttr.append('sn:Moriarty')
- listAttr.append('cn:Professor Moriarty')
- listAttr.append('l:London')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : 'uid=pmoriarty, ou=People, o=example',
- 'listAttributes' : listAttr
- }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, 'o=example' ]
- </call>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
-
-
-
- <!--- Test Case information
- #@TestMarker Replication Total Update Tests
- #@TestName Replication: Total Update: Schema total update
- #@TestID Schema total update
- #@TestPurpose Initialize the schema with total update.
- #@TestPreamble
- #@TestSteps Add entry belonging to undefined new schema on
- server B
- #@TestSteps Disable replication for cn=schema on server A
- #@TestSteps Add new objectClass and new attrType definition
- to schema in server A
- #@TestSteps Enable replication for cn=schema on server A
- (which also initialises cn=schema)
- #@TestSteps Add entry belonging to new schema on server B
- #@TestPostamble
- #@TestResult Success if first entry add attempt on server B
- fails with error 65 (objectclass violation)
- whereas second add attempt succeeds.
- -->
- <testcase name="getTestCaseName('Schema total update')">
- <sequence>
-
- <call function="'testCase_Preamble'"/>
-
- <message>
- 'Replication: Total Update: Schema total update. \
- Initialize schema with total update'
- </message>
-
- <script>
- consumer = consumerList[0]
- </script>
-
- <!-- Try to add entry belonging to new schema to "consumer"
- server; should be rejected with error 65 (objectclass violation)
+ <!--- Test Suite information
+ #@TestSuiteName Replication TotalUpdate Tests
+ #@TestSuitePurpose Verify that the total-update operations are replicated
+ correctly between two servers.
+ #@TestSuiteID TotalUpdate Tests
+ #@TestSuiteGroup TotalUpdate
+ #@TestGroup Replication
+ #@TestScript replication_totalupdate.xml
+ #@TestHTMLLink http://www.forgerock.org/
-->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumer.getHostname(),
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/testuser-1.ldif' \
- % clientDataDir,
- 'expectedRC' : 65
- }
- </call>
+
+ <call function="'testSuite_Preamble'"/>
+ <try>
+ <sequence>
+
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_setup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_setup'" >
+ { 'label' : _label }
+ </call>
- <!-- Disable schema replication on "master" server -->
- <call function="'disableReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : ['cn=schema']
- }
- </call>
-
- <script>
- newObjectclass = '( testobjectclass1-oid NAME \
- \'testobjectclass-1\' SUP person MAY ( street $ \
- testattribute-1 $ c ) X-ORIGIN \'user defined\' )'
- newAttributetype = '( testattribute1-oid NAME \
- \'testattribute-1\' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 \
- X-ORIGIN \'user defined\' )'
- </script>
-
- <!-- Modify schema in "master" server -->
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'cn=schema',
- 'attributeName' : 'attributeTypes',
- 'newAttributeValue' : newAttributetype,
- 'changetype' : 'add'
- }
- </call>
- <call function="'modifyAnAttribute'">
- { 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost ,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToModify' : 'cn=schema',
- 'attributeName' : 'objectClasses',
- 'newAttributeValue' : newObjectclass,
- 'changetype' : 'add'
- }
- </call>
-
- <!-- Re-enable schema replication on "master" server, and
- at the same time initialise the schema across the topology -->
- <script>
- if master.isOnlyLdapServer():
- masterReplPort = None
- else:
- masterReplPort = masterReplicationServer.getPort()
-
- if consumer.isOnlyLdapServer():
- consumerReplPort = None
- else:
- replicationServer = consumer.getChangelogServer()
- consumerReplPort = replicationServer.getPort()
- </script>
- <call function="'enableReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'refInstanceHost' : masterHost,
- 'refInstanceAdminPort' : master.getAdminPort(),
- 'refInstanceDn' : master.getRootDn(),
- 'refInstancePswd' : master.getRootPwd(),
- 'refReplicationPort' : masterReplPort,
- 'refOnlyLdapServer' : master.isOnlyLdapServer(),
- 'refOnlyReplServer' : master.isOnlyReplServer(),
- 'dsInstanceHost' : consumer.getHostname(),
- 'dsInstanceAdminPort' : consumer.getAdminPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'dsReplicationPort' : consumerReplPort,
- 'dsOnlyLdapServer' : consumer.isOnlyLdapServer(),
- 'dsOnlyReplServer' : consumer.isOnlyReplServer(),
- 'replicationDnList' : ['cn=schema']
- }
- </call>
-
- <!-- Add entry to "consumer" server -->
- <call function="'addEntry'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : consumer.getHostname(),
- 'dsInstancePort' : consumer.getPort(),
- 'dsInstanceDn' : consumer.getRootDn(),
- 'dsInstancePswd' : consumer.getRootPwd(),
- 'entryToBeAdded' : '%s/replication/testuser-1.ldif' \
- % clientDataDir
- }
- </call>
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('totalupdate/totalupdate_tests')
+ </script>
- <!-- Verify the synchronization of the schema among the servers
- in the topology -->
- <!-- If the schema files differ, it could be due to Issue OPENDJ-449
- (Replication adds modifiersName and modifyTimestamp to schema
- updates) -->
- <call function="'verifySchemas'">
- [ clientHost, clientPath, master, consumerList, '99-user.ldif',
- 'OPENDJ-449' ]
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, 'o=example' ]
- </call>
+ <!-- Import the files for this test suite -->
+ <iterate var="_import" in="importList">
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/%s.xml' % (_groupdir,_import)"/>
+ </iterate>
-
- <call function="'testCase_Postamble'"/>
- </sequence>
- </testcase>
+ <!-- Specific to replication tests -->
+ <script>
+ msg1 = 'Replication: TotalUpdate:'
+ server1DataDir = '%s' % server1.getDataDir()
+ </script>
+
+ <!-- List of Test Cases -->
+ <script>
+ testsList=[]
+ testsList.append('replication_totalupdate_001')
+ testsList.append('replication_totalupdate_002')
+ testsList.append('replication_totalupdate_003')
+ </script>
-
+ <!-- Execute the Tests -->
+ <iterate var="__test" in="testsList">
+ <sequence>
+ <call function="'%s' % (__test)" />
+ </sequence>
+ </iterate>
+
+ </sequence>
- <!--- Test Case information
- #@TestMarker Replication Total Update Tests
- #@TestName Replication: Total Update: Initialize all
- #@TestID Initialize all
- #@TestPurpose Initialize all servers with total update
- #@TestPreamble
- #@TestSteps Stop server A
- #@TestSteps Import data into server A
- #@TestSteps Start server A
- #@TestSteps Initialise (dsreplication initialize all) all
- the servers from server A
- #@TestSteps Check suffix has been initialised on every
- server
- #@TestSteps Add entry on server A
- #@TestPostamble
- #@TestResult Success if initialisation call succeeds for all
- servers and all servers are synchronised
- -->
- <testcase name="getTestCaseName('Initialize all')">
- <sequence>
-
- <call function="'testCase_Preamble'"/>
-
- <message>
- 'Replication: Total Update: Initialize all. Initialize all \
- servers with total update'
- </message>
-
- <!-- Stop "master" Directory Server -->
- <call function="'StopDsWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsHost' : masterHost,
- 'dsAdminPort' : master.getAdminPort(),
- 'dsBindDN' : master.getRootDn(),
- 'dsBindPwd' : master.getRootPwd()
- }
- </call>
-
- <!-- Check that the Directory Server is stopped -->
-
- <!-- Import data into "master" Directory Server -->
- <call function="'ImportLdifWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'backEnd' : DIRECTORY_INSTANCE_BE,
- 'ldifFile' : '%s/replication/Short_Example.ldif' \
- % masterDataDir
- }
- </call>
-
- <!-- Start the Directory Server -->
- <call function="'StartDsWithScript'">
- { 'location' : masterHost,
- 'dsPath' : masterPath
- }
- </call>
-
- <!-- Wait for DS to start -->
- <call function="'isAlive'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort() ,
- 'dsInstanceDn' : master.getRootDn() ,
- 'dsInstancePswd' : master.getRootPwd() ,
- 'noOfLoops' : 10 ,
- 'noOfMilliSeconds' : 2000
- }
- </call>
-
- <!-- Check some data was imported into Directory Server -->
- <call function="'checkImport'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsHost' : masterHost,
- 'dsPort' : master.getPort(),
- 'dsAdminPort' : master.getAdminPort(),
- 'dsDn' : master.getRootDn(),
- 'dsPswd' : master.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=sholmes, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
-
-
- <!-- Perform the total update -->
- <call function="'initializeReplication'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'sourceInstanceHost' : masterHost,
- 'sourceInstanceAdminPort' : master.getAdminPort(),
- 'replicationDnList' : ['o=example']
- }
- </call>
-
-
- <iterate var="server" in="consumerList">
- <sequence>
- <!-- Verify the total update -->
- <call function="'checkImport'">
- { 'location' : server.getHostname(),
- 'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
- 'dsHost' : server.getHostname(),
- 'dsPort' : server.getPort(),
- 'dsAdminPort' : server.getAdminPort(),
- 'dsDn' : server.getRootDn(),
- 'dsPswd' : server.getRootPwd(),
- 'expectedEntries' : ['uid=scarter,ou=People,o=example',
- 'uid=dmiller, ou=People, o=example',
- 'uid=sholmes, ou=People, o=example'],
- 'startDS' : 'no'
- }
- </call>
+ <catch exception="'STAFException.TestSuite.SetupException'">
+ <sequence>
+ <message log="1" level="'fatal'">
+ 'Setup of test suite failed.'
+ </message>
+ <rethrow/>
</sequence>
- </iterate>
+ </catch>
+
+ <finally>
+ <message>'Test Cases Completed.'</message>
+ </finally>
- <!-- To make sure replication is working: add entry to "master"
- server -->
- <script>
- listAttr = []
- listAttr.append('objectclass:top')
- listAttr.append('objectclass:organizationalperson')
- listAttr.append('objectclass:inetorgperson')
- listAttr.append('objectclass:person')
- listAttr.append('givenname:Professor Moriarty')
- listAttr.append('sn:Moriarty')
- listAttr.append('cn:Professor Moriarty')
- listAttr.append('l:London')
- </script>
-
- <call function="'addAnEntry'">
- { 'location' : masterHost,
- 'dsPath' : masterPath,
- 'dsInstanceHost' : masterHost,
- 'dsInstancePort' : master.getPort(),
- 'dsInstanceDn' : master.getRootDn(),
- 'dsInstancePswd' : master.getRootPwd(),
- 'DNToAdd' : 'uid=pmoriarty, ou=People, o=example',
- 'listAttributes' : listAttr
- }
- </call>
-
- <!-- Verify the synchronization of the trees among the servers in
- the topology -->
- <call function="'verifyTrees'">
- [ clientHost, clientPath, master, consumerList, 'o=example' ]
- </call>
+ </try>
- <call function="'testCase_Postamble'"/>
+ </sequence>
+
+ <finally>
+ <sequence>
+ <!-- Test Suite Cleanup -->
+ <message>'Finally: Replication Cleanup.'</message>
+ <try>
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/replication/replication_cleanup.xml'
+ % (TESTS_DIR)"/>
+ <call function="'replication_cleanup'">
+ { 'label' : _label }
+ </call>
+ </sequence>
+ <catch exception="'STAFException'">
+ <sequence>
+ <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+ </sequence>
+ </catch>
+ <finally>
+ <call function="'testSuite_Postamble'"/>
+ </finally>
+ </try>
</sequence>
- </testcase>
-
-
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_cleanup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_cleanup'" >
- { 'label' : 'Replication Totalupdate' }
- </call>
-
- <call function="'testSuite_Postamble'"/>
- </sequence>
+ </finally>
+
+ </try>
</block>
</sequence>
</function>
diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate_tests.xml
new file mode 100644
index 0000000..cd4b9b9
--- /dev/null
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate_tests.xml
@@ -0,0 +1,565 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2007-2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2012 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!--- Test Case : Total Update -->
+ <!--- Test Case information
+ #@TestMarker Replication Total Update Tests
+ #@TestName Replication: Total Update: Simple LDIF
+ #@TestID Simple LDIF
+ #@TestPurpose Initialize server with total update
+ #@TestPreamble
+ #@TestSteps Stop server A
+ #@TestSteps Import data into server A
+ #@TestSteps Start server A
+ #@TestSteps Initialise (dsreplication initialize)
+ every other server from server A
+ #@TestSteps Check suffix has been initialised on every
+ server
+ #@TestSteps Add entry on server A
+ #@TestPostamble
+ #@TestResult Success if initialisation call succeeds for all
+ servers and all servers are synchronised
+ -->
+ <function name="replication_totalupdate_001" scope="local">
+ <testcase name="getTestCaseName('Simple LDIF')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Simple LDIF. Initialize server with total update.' % msg1 }
+ </call>
+
+ <!-- Stop "master" Directory Server -->
+ <call function="'StopDsWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsHost' : masterHost,
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsBindDN' : master.getRootDn(),
+ 'dsBindPwd' : master.getRootPwd()
+ }
+ </call>
+
+ <!-- Check that the Directory Server is stopped -->
+
+ <!-- Import data into "master" Directory Server -->
+ <call function="'ImportLdifWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'backEnd' : DIRECTORY_INSTANCE_BE,
+ 'ldifFile' : '%s/replication/Example.ldif' % masterDataDir
+ }
+ </call>
+
+ <!-- Start the Directory Server -->
+ <call function="'StartDsWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath
+ }
+ </call>
+
+ <!-- Wait for DS to start -->
+ <call function="'isAlive'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'noOfLoops' : 10 ,
+ 'noOfMilliSeconds' : 2000
+ }
+ </call>
+
+ <!-- Check some data was imported into Directory Server -->
+ <call function="'checkImport'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsHost' : masterHost,
+ 'dsPort' : master.getPort(),
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsDn' : master.getRootDn(),
+ 'dsPswd' : master.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=rhunt, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+
+
+ <iterate var="server" in="consumerList">
+ <sequence>
+ <!-- Perform the total update -->
+ <call function="'initializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server.getHostname(),
+ 'dsInstanceAdminPort' : server.getAdminPort(),
+ 'sourceInstanceHost' : masterHost,
+ 'sourceInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : ['o=example']
+ }
+ </call>
+
+ <!-- Verify the total update -->
+ <call function="'checkImport'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
+ 'dsHost' : server.getHostname(),
+ 'dsPort' : server.getPort(),
+ 'dsAdminPort' : server.getAdminPort(),
+ 'dsDn' : server.getRootDn(),
+ 'dsPswd' : server.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=rhunt, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- To make sure replication is working: add entry to "master"
+ server -->
+ <script>
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Professor Moriarty')
+ listAttr.append('sn:Moriarty')
+ listAttr.append('cn:Professor Moriarty')
+ listAttr.append('l:London')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : 'uid=pmoriarty, ou=People, o=example',
+ 'listAttributes' : listAttr
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, 'o=example' ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Total Update Tests
+ #@TestName Replication: Total Update: Schema total update
+ #@TestID Schema total update
+ #@TestPurpose Initialize the schema with total update.
+ #@TestPreamble
+ #@TestSteps Add entry belonging to undefined new schema on
+ server B
+ #@TestSteps Disable replication for cn=schema on server A
+ #@TestSteps Add new objectClass and new attrType definition
+ to schema in server A
+ #@TestSteps Enable replication for cn=schema on server A
+ (which also initialises cn=schema)
+ #@TestSteps Add entry belonging to new schema on server B
+ #@TestPostamble
+ #@TestResult Success if first entry add attempt on server B
+ fails with error 65 (objectclass violation)
+ whereas second add attempt succeeds.
+ -->
+ <function name="replication_totalupdate_002" scope="local">
+ <testcase name="getTestCaseName('Schema total update')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialize schema with total update.' % msg1 }
+ </call>
+
+ <script>
+ consumer = consumerList[0]
+ </script>
+
+ <!-- Try to add entry belonging to new schema to "consumer"
+ server; should be rejected with error 65 (objectclass violation)
+ -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumer.getHostname(),
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/testuser-1.ldif' \
+ % clientDataDir,
+ 'expectedRC' : 65
+ }
+ </call>
+
+
+ <!-- Disable schema replication on "master" server -->
+ <call function="'disableReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : ['cn=schema']
+ }
+ </call>
+
+ <script>
+ newObjectclass = '( testobjectclass1-oid NAME \
+ \'testobjectclass-1\' SUP person MAY ( street $ \
+ testattribute-1 $ c ) X-ORIGIN \'user defined\' )'
+ newAttributetype = '( testattribute1-oid NAME \
+ \'testattribute-1\' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 \
+ X-ORIGIN \'user defined\' )'
+ </script>
+
+ <!-- Modify schema in "master" server -->
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'cn=schema',
+ 'attributeName' : 'attributeTypes',
+ 'newAttributeValue' : newAttributetype,
+ 'changetype' : 'add'
+ }
+ </call>
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToModify' : 'cn=schema',
+ 'attributeName' : 'objectClasses',
+ 'newAttributeValue' : newObjectclass,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Re-enable schema replication on "master" server, and
+ at the same time initialise the schema across the topology -->
+ <script>
+ if master.isOnlyLdapServer():
+ masterReplPort = None
+ else:
+ masterReplPort = masterReplicationServer.getPort()
+
+ if consumer.isOnlyLdapServer():
+ consumerReplPort = None
+ else:
+ replicationServer = consumer.getChangelogServer()
+ consumerReplPort = replicationServer.getPort()
+ </script>
+ <call function="'enableReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'refInstanceHost' : masterHost,
+ 'refInstanceAdminPort' : master.getAdminPort(),
+ 'refInstanceDn' : master.getRootDn(),
+ 'refInstancePswd' : master.getRootPwd(),
+ 'refReplicationPort' : masterReplPort,
+ 'refOnlyLdapServer' : master.isOnlyLdapServer(),
+ 'refOnlyReplServer' : master.isOnlyReplServer(),
+ 'dsInstanceHost' : consumer.getHostname(),
+ 'dsInstanceAdminPort' : consumer.getAdminPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'dsReplicationPort' : consumerReplPort,
+ 'dsOnlyLdapServer' : consumer.isOnlyLdapServer(),
+ 'dsOnlyReplServer' : consumer.isOnlyReplServer(),
+ 'replicationDnList' : ['cn=schema']
+ }
+ </call>
+
+ <!-- Add entry to "consumer" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : consumer.getHostname(),
+ 'dsInstancePort' : consumer.getPort(),
+ 'dsInstanceDn' : consumer.getRootDn(),
+ 'dsInstancePswd' : consumer.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/testuser-1.ldif' \
+ % clientDataDir
+ }
+ </call>
+
+ <!-- Verify the synchronization of the schema among the servers
+ in the topology -->
+ <!-- If the schema files differ, it could be due to Issue OPENDJ-449
+ (Replication adds modifiersName and modifyTimestamp to schema
+ updates) -->
+ <call function="'verifySchemas'">
+ [ clientHost, clientPath, master, consumerList, '99-user.ldif',
+ 'OPENDJ-449' ]
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, 'o=example' ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+
+
+ <!--- Test Case information
+ #@TestMarker Replication Total Update Tests
+ #@TestName Replication: Total Update: Initialize all
+ #@TestID Initialize all
+ #@TestPurpose Initialize all servers with total update
+ #@TestPreamble
+ #@TestSteps Stop server A
+ #@TestSteps Import data into server A
+ #@TestSteps Start server A
+ #@TestSteps Initialise (dsreplication initialize all) all
+ the servers from server A
+ #@TestSteps Check suffix has been initialised on every
+ server
+ #@TestSteps Add entry on server A
+ #@TestPostamble
+ #@TestResult Success if initialisation call succeeds for all
+ servers and all servers are synchronised
+ -->
+ <function name="replication_totalupdate_003" scope="local">
+ <testcase name="getTestCaseName('Initialize all')">
+ <sequence>
+ <try>
+ <sequence>
+
+ <call function="'testCase_Preamble'"/>
+
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <call function="'testStep'">
+ { 'stepMessage' : '%s Initialize all servers with total update.' % msg1 }
+ </call>
+
+ <!-- Stop "master" Directory Server -->
+ <call function="'StopDsWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsHost' : masterHost,
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsBindDN' : master.getRootDn(),
+ 'dsBindPwd' : master.getRootPwd()
+ }
+ </call>
+
+ <!-- Check that the Directory Server is stopped -->
+
+ <!-- Import data into "master" Directory Server -->
+ <call function="'ImportLdifWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'backEnd' : DIRECTORY_INSTANCE_BE,
+ 'ldifFile' : '%s/replication/Short_Example.ldif' \
+ % masterDataDir
+ }
+ </call>
+
+ <!-- Start the Directory Server -->
+ <call function="'StartDsWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath
+ }
+ </call>
+
+ <!-- Wait for DS to start -->
+ <call function="'isAlive'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'noOfLoops' : 10 ,
+ 'noOfMilliSeconds' : 2000
+ }
+ </call>
+
+ <!-- Check some data was imported into Directory Server -->
+ <call function="'checkImport'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsHost' : masterHost,
+ 'dsPort' : master.getPort(),
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsDn' : master.getRootDn(),
+ 'dsPswd' : master.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=sholmes, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+
+
+ <!-- Perform the total update -->
+ <call function="'initializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'sourceInstanceHost' : masterHost,
+ 'sourceInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : ['o=example']
+ }
+ </call>
+
+
+ <iterate var="server" in="consumerList">
+ <sequence>
+ <!-- Verify the total update -->
+ <call function="'checkImport'">
+ { 'location' : server.getHostname(),
+ 'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
+ 'dsHost' : server.getHostname(),
+ 'dsPort' : server.getPort(),
+ 'dsAdminPort' : server.getAdminPort(),
+ 'dsDn' : server.getRootDn(),
+ 'dsPswd' : server.getRootPwd(),
+ 'expectedEntries' : ['uid=scarter,ou=People,o=example',
+ 'uid=dmiller, ou=People, o=example',
+ 'uid=sholmes, ou=People, o=example'],
+ 'startDS' : 'no'
+ }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- To make sure replication is working: add entry to "master"
+ server -->
+ <script>
+ listAttr = []
+ listAttr.append('objectclass:top')
+ listAttr.append('objectclass:organizationalperson')
+ listAttr.append('objectclass:inetorgperson')
+ listAttr.append('objectclass:person')
+ listAttr.append('givenname:Professor Moriarty')
+ listAttr.append('sn:Moriarty')
+ listAttr.append('cn:Professor Moriarty')
+ listAttr.append('l:London')
+ </script>
+
+ <call function="'addAnEntry'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort(),
+ 'dsInstanceDn' : master.getRootDn(),
+ 'dsInstancePswd' : master.getRootPwd(),
+ 'DNToAdd' : 'uid=pmoriarty, ou=People, o=example',
+ 'listAttributes' : listAttr
+ }
+ </call>
+
+ <!-- Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, 'o=example' ]
+ </call>
+
+ </sequence>
+
+ <catch exception="'STAXException'" typevar="eType" var="eInfo">
+ <message log="1" level="'fatal'">
+ '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+ </message>
+ </catch>
+ <finally>
+ <sequence>
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+</stax>
--
Gitblit v1.10.0