From adf7c5f9070ac56cdee1c3e7247df7e120a0c3ee Mon Sep 17 00:00:00 2001
From: Gary Williams <gary.williams@forgerock.com>
Date: Tue, 28 Jun 2011 12:46:19 +0000
Subject: [PATCH] add replication ECL consistency tests
---
opends/tests/staf-tests/shared/python/common.py | 48
opends/tests/staf-tests/shared/functions/environment.xml | 3
opends/tests/staf-tests/shared/python/objects.py | 45
opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_consistency_tests.xml | 2501 ++++++++++++++++++++++++++++++++++++++++++++++++++++
opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog.xml | 206 +++-
opends/tests/staf-tests/shared/tests/config.py.stubs | 2
opends/tests/staf-tests/shared/functions/utils.xml | 28
opends/tests/staf-tests/shared/functions/ldap.xml | 5
8 files changed, 2,776 insertions(+), 62 deletions(-)
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog.xml
index ab9b375..ef21544 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog.xml
@@ -32,70 +32,162 @@
<function name="replication_externalchangelog">
<sequence>
- <block name="'externalchangelog'">
+ <!-- Do not run the tests if servers are split, as it is not supported
+ ! by External Changelog to have RS separated from DS -->
+ <if expr="globalSplitServers == True">
<sequence>
-
- <!-- Do not run the tests if servers are split, as it is not supported
- ! by External Changelog to have RS separated from DS -->
- <if expr="globalSplitServers != True">
- <sequence>
-
- <script>
- if not CurrentTestPath.has_key('group'):
- CurrentTestPath['group']='replication'
- CurrentTestPath['suite']=STAXCurrentBlock
-
- _group = 'replication'
- _suite = 'externalchangelog'
- </script>
-
- <call function="'testSuite_Preamble'"/>
-
- <!--- Test Suite information
- #@TestSuiteName Replication External Changelog Tests
- #@TestSuitePurpose Test the event notification system provided by
- the External Changelog.
- #@TestSuiteID External Changelog Tests
- #@TestSuiteGroup External Changelog
- #@TestGroup Replication
- #@TestScript replication_externalchangelog.xml
- #@TestHTMLLink http://opends.dev.java.net/
- -->
+ <message>'External changelog not supported in replication split servers mode.'</message>
+ <message>'This test suite will not be run for this reason.'</message>
+ <return>0</return>
+ </sequence>
+ </if>
+ <block name="'externalchangelog'">
+ <try>
+ <sequence>
- <import machine="STAF_LOCAL_HOSTNAME"
- file="'%s/testcases/replication/replication_setup.xml'
- % (TESTS_DIR)"/>
- <call function="'replication_setup'"/>
-
- <script>
- ecl_modes=[]
- ecl_modes.append('opends')
- ecl_modes.append('draft')
- </script>
-
- <iterate var="ecl_mode" in="ecl_modes">
+ <script>
+ if not CurrentTestPath.has_key('group'):
+ CurrentTestPath['group']='replication'
+ CurrentTestPath['suite']=STAXCurrentBlock
+
+ _group = 'replication'
+ _suite = 'externalchangelog'
+ _groupdir='%s/testcases/%s' % (TESTS_DIR,_group)
+ </script>
+
+ <call function="'testSuite_Preamble'"/>
+
+ <try>
+
+ <sequence>
+
+ <!--- Test Suite information
+ #@TestSuiteName Replication External Changelog Tests
+ #@TestSuitePurpose Test the event notification system provided by
+ the External Changelog.
+ #@TestSuiteID External Changelog Tests
+ #@TestSuiteGroup External Changelog
+ #@TestGroup Replication
+ #@TestScript replication_externalchangelog.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'"/>
+
+ <script>
+ ecl_modes=[]
+ ecl_modes.append('opends')
+ ecl_modes.append('draft')
+ </script>
+
+ <iterate var="ecl_mode" in="ecl_modes">
+ <sequence>
+ <import machine="STAF_LOCAL_HOSTNAME"
+ file="'%s/testcases/%s/%s/%s_common_ecl_tests.xml'
+ % (TESTS_DIR, _group, _suite, _suite)"/>
+ <call function="'common_ecl_tests'">
+ { 'ecl_mode' : ecl_mode }
+ </call>
+ </sequence>
+ </iterate>
+
+ <!-- List of Import of Test Functions -->
+ <script>
+ importList=[]
+ importList.append('externalchangelog/externalchangelog_consistency_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>
+
+ <!-- List of Test Cases -->
+ <script>
+ ecl_purge_delay = '120'
+
+ # Globals for cookies, changenumbers, lastchangenumbers
+ global_cookiesList=STAXGlobal([])
+ global_cnsList=STAXGlobal([])
+ global_lcnsList=STAXGlobal([])
+
+ # List of tests to run
+ testsList=[]
+ testsList.append('ecl_setup')
+ testsList.append('ecl_add_cookies_001')
+ testsList.append('ecl_mod_cookies_001')
+ testsList.append('ecl_changenumbers_001')
+ testsList.append('ecl_draft_cookies_001')
+ testsList.append('ecl_cookies_001')
+ testsList.append('ecl_draft_changenumbers_001')
+ testsList.append('ecl_cookies_002')
+ testsList.append('ecl_draft_changenumbers_002')
+ testsList.append('ecl_cookies_003')
+ testsList.append('ecl_draft_changenumbers_003')
+ testsList.append('ecl_purge_sleep_001')
+ testsList.append('ecl_purge_001')
+ testsList.append('ecl_purge_002')
+ testsList.append('ecl_purge_003')
+ testsList.append('ecl_purge_004')
+ testsList.append('ecl_purge_005')
+ testsList.append('ecl_cleanup')
+ </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/%s/%s/%s_common_ecl_tests.xml'
- % (TESTS_DIR, _group, _suite, _suite)"/>
- <call function="'common_ecl_tests'">
- { 'ecl_mode' : ecl_mode }
- </call>
- </sequence>
- </iterate>
-
- <import machine="STAF_LOCAL_HOSTNAME"
file="'%s/testcases/replication/replication_cleanup.xml'
% (TESTS_DIR)"/>
- <call function="'replication_cleanup'" />
-
- <call function="'testSuite_Postamble'"/>
-
+ <call function="'replication_cleanup'" />
+ </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>
- </if>
-
- </sequence>
+ </finally>
+
+ </try>
</block>
</sequence>
</function>
-</stax>
+</stax>
\ No newline at end of file
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_consistency_tests.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_consistency_tests.xml
new file mode 100644
index 0000000..467998c
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_consistency_tests.xml
@@ -0,0 +1,2501 @@
+<?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/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/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 2011 ForgeRock AS.
+ ! -->
+<stax>
+
+ <!-- Definition of Preamble -->
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL
+ #@TestID ecl_setup
+ #@TestPurpose Setup ecl
+ #@TestPreamble
+ #@TestSteps Step1: TBD
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_setup" scope="local">
+ <testcase name="getTestCaseName('ecl_setup')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: External Changelog: - Setup. \
+ Set up environment for External Changelog tests'
+ </message>
+
+ <message>
+ 'Common ECL tests: reset data'
+ </message>
+
+ <!-- Pre-initialise the servers in the topology -->
+ <call function="'preInitializeReplication'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstanceAdminPort' : master.getAdminPort(),
+ 'localOnly' : False,
+ 'replicationDnList' : [synchroSuffix],
+ 'adminUID' : adminUID,
+ 'adminPswd' : adminPswd
+ }
+ </call>
+
+ <!-- Stop "master" Directory Server -->
+ <call function="'StopDsWithScript'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsHost' : masterHost,
+ 'dsAdminPort' : master.getAdminPort(),
+ 'dsBindDN' : master.getRootDn(),
+ 'dsBindPwd' : master.getRootPwd()
+ }
+ </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>
+
+ <!-- Perform the total update -->
+ <call function="'initializeReplication'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'sourceInstanceHost' : masterHost,
+ 'sourceInstanceAdminPort' : master.getAdminPort(),
+ 'replicationDnList' : [synchroSuffix]
+ }
+ </call>
+
+ <!-- Set replication purge delay in cdthe various replication servers -->
+ <paralleliterate var="server" in="_topologyServerList">
+ <sequence>
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Set purge delay to %s seconds on server %s:%s' \
+ % (ecl_purge_delay, replServer.getHostname(), replServer.getPort())
+ </message>
+
+ <!-- Set purge delay to 120s on "master" server -->
+ <call function="'dsconfigSet'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstanceAdminPort' : replServer.getAdminPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'objectName' : 'replication-server' ,
+ 'propertyType' : 'provider',
+ 'propertyName' : 'Multimaster Synchronization',
+ 'attributeName' : 'replication-purge-delay' ,
+ 'attributeValue' : '%s s' % ecl_purge_delay
+ }
+ </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>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Add Cookies
+ #@TestID ecl_add_cookies_001
+ #@TestPurpose Verify that the 2 servers have consistent COOKIE on add.
+ #@TestPreamble
+ #@TestSteps Step 1: Add entries in the various replication servers
+ #@TestSteps Step 2: Check that the changeLogCookie and lastExternalChangelogCookie match
+ #@TestSteps Step 3: Verify the synchronization of the trees among the servers in the topology
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_add_cookies_001" scope="local">
+ <testcase name="getTestCaseName('ecl_add_cookies_001')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Step 1: Add entries in the various replication servers -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Add entries in the various replication servers.' }
+ </call>
+
+ <script>
+ entrynum = 1
+ </script>
+
+ <iterate var="server" in="_topologyServerList" indexvar="'entrynum'">
+ <sequence>
+ <!-- Add entry to both" servers -->
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+
+ myEntry = person_entry('cn=Change%s' % entrynum, synchroSuffix)
+ myEntry.addAttr('sn', 'Change%s' % entrynum)
+ myEntry.addAttr('description', 'this is change %s' % entrynum)
+ myEntry.addAttr('uid', 'Change%s'.lower() % entrynum)
+
+ entrynum += 1
+ </script>
+
+ <message>
+ 'Add Entry (%s) on server %s:%s' \
+ % (myEntry.getDn(), replServer.getHostname(), replServer.getPort())
+ </message>
+
+ <!-- Add an Entry under suffix -->
+ <call function="'addAnEntry'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'DNToAdd' : myEntry.getDn(),
+ 'listAttributes' : myEntry.getAttrList()
+ }
+ </call>
+
+ </sequence>
+ </iterate>
+
+ <!-- Step 2: Check that the changeLogCookie and lastExternalChangelogCookie match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeLogCookie and lastExternalChangelogCookie match.' }
+ </call>
+
+ <script>
+ entrynum = 1
+ cookiesList = []
+ </script>
+ <iterate var="server" in="_topologyServerList" indexvar="'entrynum'">
+ <sequence>
+ <!-- Add entry to both" servers -->
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'dsControl' : '1.3.6.1.4.1.26027.1.5.4:false:;',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ global_cookiesList.set(clc)
+ </script>
+
+ <!-- Search for lastExternalChangelogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastExternalChangelogCookie',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lecc = get_last_attr_from_entry(STAXResult,'lastExternalChangelogCookie')
+ cookiesList.append(lecc)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookie and lastExternalChangelogCookie -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ <!-- Step 3: Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Verify the synchronization of the trees among the servers in the topology.' }
+ </call>
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Cookie
+ #@TestID ecl_mod_cookies_001
+ #@TestPurpose Verify that the 2 servers have consistent COOKIE on modify
+ #@TestPreamble
+ #@TestSteps Step 1: Modify Entries various replication servers
+ #@TestSteps Step 2: Check that the changeLogCookie and lastExternalChangelogCookie match
+ #@TestSteps Step 3: Verify the synchronization of the trees among the servers in the topology
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_mod_cookies_001" scope="local">
+ <testcase name="getTestCaseName('ecl_mod_cookies_001')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Step1: Modify Entries various replication servers -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Modify Entries various replication servers.' }
+ </call>
+
+ <script>
+ entrynum = 1
+ cookiesList = []
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Modify entry to both" servers -->
+ <script>
+ myEntry = person_entry('cn=Change%s' % entrynum, synchroSuffix)
+
+ entrynum += 1
+ </script>
+
+ <message>
+ 'Modify Entry (%s) on server %s:%s' \
+ % (myEntry.getDn(), replServer.getHostname(), replServer.getPort())
+ </message>
+
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname() ,
+ 'dsInstancePort' : replServer.getPort() ,
+ 'dsInstanceDn' : replServer.getRootDn() ,
+ 'dsInstancePswd' : replServer.getRootPwd() ,
+ 'DNToModify' : myEntry.getDn() ,
+ 'attributeName' : 'description' ,
+ 'newAttributeValue' : 'This is a new change' ,
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Lets Read the Entry back to be sure -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : myEntry.getDn(),
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'description',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ </sequence>
+ </iterate>
+
+ <!-- Step2: Check that the changeLogCookie and lastExternalChangelogCookie match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeLogCookie and lastExternalChangelogCookie match.' }
+ </call>
+ <script>
+ mycookie = global_cookiesList.get()
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'dsControl' : '1.3.6.1.4.1.26027.1.5.4:false:%s' % mycookie,
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ global_cookiesList.set(clc)
+ </script>
+
+ <!-- Search for lastExternalChangelogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastExternalChangelogCookie',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lecc = get_last_attr_from_entry(STAXResult,'lastExternalChangelogCookie')
+ cookiesList.append(lecc)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookie and lastExternalChangelogCookie -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ <!-- Step 3: Verify the synchronization of the trees among the servers in
+ the topology -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Verify the synchronization of the trees among the servers in the topology.' }
+ </call>
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: ChangeNumbers
+ #@TestID ecl_changenumbers_001
+ #@TestPurpose Verify that the 2 servers have consistent change numbers
+ #@TestPreamble
+ #@TestSteps Step1: Check that the changeNumber and lastChangeNumber match
+ #@TestSteps Step2: Check that firstChangeNumbers match
+ #@TestSteps Step3: Count changelog entries in draft mode
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_changenumbers_001" scope="local">
+ <testcase name="getTestCaseName('ecl_changenumbers_001')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Reset List -->
+ <script>
+ cnsList = []
+ </script>
+
+ <!-- Step1: Check that the changeNumber and lastChangeNumber match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeNumber and lastChangeNumber match.' }
+ </call>
+
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ cn = get_last_attr_from_entry(STAXResult,'changeNumber')
+ cnsList.append(cn)
+ global_cnsList.set(cn)
+ </script>
+
+ <!-- Search for lastChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lcn = get_last_attr_from_entry(STAXResult,'lastChangeNumber')
+ cnsList.append(lcn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeNumber and lastChangeNumber -->
+ <call function="'compareItems'">
+ { 'items' : cnsList,
+ 'label' : 'changeNumbers'
+ }
+ </call>
+
+ <!-- Step2: Check that firstChangeNumbers match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that firstChangeNumbers match.' }
+ </call>
+
+ <script>
+ fcnsList = []
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for firstChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsScope' : 'base',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'firstChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ fcn = get_last_attr_from_entry(STAXResult,'firstChangeNumber')
+ fcnsList.append(fcn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare firstChangeNumbers -->
+ <call function="'compareItems'">
+ { 'items' : fcnsList ,
+ 'label' : 'firstChangeNumber'
+ }
+ </call>
+
+ <!-- Step3: Count changelog entries in draft mode -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Count changelog entries in draft mode.' }
+ </call>
+
+ <script>
+ dncList = []
+ #4 changes + top
+ noOfEntries = 5
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Count the number of initial changes -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'dn' ,
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ dncount=int(count_attr(STAXResult))
+ dncList.append(dncount)
+ </script>
+
+ <if expr="dncount == 5">
+ <message>
+ 'Search returned %s changes, expected %s' % (dncount,noOfEntries)
+ </message>
+ <else>
+ <sequence>
+ <tcstatus result="'fail'"/>
+ <message level="'error'">
+ 'Search returned %s changes, expected %s' % (dncount,noOfEntries)
+ </message>
+ </sequence>
+ </else>
+ </if>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare number of entries -->
+ <call function="'compareItems'">
+ { 'items' : dncList ,
+ 'label' : 'numberOfEntries'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Draft Cookies
+ #@TestID ecl_draft_cookies_001
+ #@TestPurpose Verify in draft mode the 2 servers have consistent changeLogCookie
+ #@TestPreamble
+ #@TestSteps Step1: Check that the changeLogCookie match
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_draft_cookies_001" scope="local">
+ <testcase name="getTestCaseName('ecl_draft_cookies_001')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <script>
+ mychangenumber = global_cnsList.get()
+ cookiesList = []
+ </script>
+
+ <!-- Check that the changeLogCookie match -->
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(changenumber=%s)' % mychangenumber,
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookie -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Cookies
+ #@TestID ecl_cookies_001
+ #@TestPurpose Verify that after change to master all servers have consistent COOKIE
+ #@TestPreamble
+ #@TestSteps Step1: Modify entry on one server
+ #@TestSteps Step2: Check that the changeLogCookie and lastExternalChangelogCookie match
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_cookies_001" scope="local">
+ <testcase name="getTestCaseName('ecl_cookies_001')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Step1: Modify entry on one server -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Modify entry on one server.' }
+ </call>
+
+ <script>
+ cookiesList = []
+ myEntry = person_entry('cn=Change1', synchroSuffix)
+ </script>
+
+ <message>
+ 'Modify Entry (%s) on server %s:%s' \
+ % (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'DNToModify' : myEntry.getDn() ,
+ 'attributeName' : 'description' ,
+ 'newAttributeValue' : 'this is a change on server 1',
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Step2: Check that the changeLogCookie and lastExternalChangelogCookie match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeLogCookie and lastExternalChangelogCookie match.' }
+ </call>
+
+ <script>
+ mycookie = global_cookiesList.get()
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'dsControl' : '1.3.6.1.4.1.26027.1.5.4:false:%s' % mycookie,
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ global_cookiesList.set(clc)
+ </script>
+
+ <!-- Search for lastExternalChangelogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastExternalChangelogCookie',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lecc = get_last_attr_from_entry(STAXResult,'lastExternalChangelogCookie')
+ cookiesList.append(lecc)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookie and lastExternalChangelogCookie -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Draft ChangeNumbers
+ #@TestID ecl_draft_changenumbers_001
+ #@TestPurpose Verify in draft mode servers have consistent changeNumber and lastChangeNumber
+ #@TestPreamble
+ #@TestSteps Step1: Check that the changeNumber and lastChangeNumber match
+
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_draft_changenumbers_001" scope="local">
+ <testcase name="getTestCaseName('ecl_draft_changenumbers_001')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Reset List -->
+ <script>
+ cnsList = []
+ </script>
+
+ <!-- Step1: Check that the changeNumber and lastChangeNumber match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeNumber and lastChangeNumber match.' }
+ </call>
+
+ <script>
+ mychangenumber = global_cnsList.get()
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(changenumber>=%s)' % mychangenumber,
+ 'dsAttributes' : 'changeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ cn = get_last_attr_from_entry(STAXResult,'changeNumber')
+ cnsList.append(cn)
+ global_cnsList.set(cn)
+ </script>
+
+ <!-- Search for lastChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lcn = get_last_attr_from_entry(STAXResult,'lastChangeNumber')
+ cnsList.append(lcn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeNumber and lastChangeNumber -->
+ <call function="'compareItems'">
+ { 'items' : cnsList,
+ 'label' : 'changeNumbers'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Cookie
+ #@TestID ecl_cookies_002
+ #@TestPurpose Verify that after change to consumer all servers have consistent COOKIE
+ #@TestPreamble
+ #@TestSteps Step1: Modify entry on one server
+ #@TestSteps Step2: Check that the changeLogCookie and lastExternalChangelogCookie match
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_cookies_002" scope="local">
+ <testcase name="getTestCaseName('ecl_cookies_002')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Modify entry on one server -->
+ <script>
+ cookiesList = []
+ myEntry = person_entry('cn=Change1', synchroSuffix)
+
+ consumerServer = consumerList[0]
+ consumerServerPath = '%s/%s' % (consumerServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Modify Entry (%s) on server %s:%s' \
+ % (myEntry.getDn(), consumerServer.getHostname(), consumerServer.getPort())
+ </message>
+
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : consumerServerPath,
+ 'dsInstanceHost' : consumerServer.getHostname() ,
+ 'dsInstancePort' : consumerServer.getPort() ,
+ 'dsInstanceDn' : consumerServer.getRootDn() ,
+ 'dsInstancePswd' : consumerServer.getRootPwd() ,
+ 'DNToModify' : myEntry.getDn() ,
+ 'attributeName' : 'description' ,
+ 'newAttributeValue' : 'this is a change on server 2',
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Check that the changeLogCookie and lastExternalChangelogCookie match -->
+ <script>
+ mycookie = global_cookiesList.get()
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'dsControl' : '1.3.6.1.4.1.26027.1.5.4:false:%s' % mycookie,
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ global_cookiesList.set(clc)
+ </script>
+
+ <!-- Search for lastExternalChangelogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastExternalChangelogCookie',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lecc = get_last_attr_from_entry(STAXResult,'lastExternalChangelogCookie')
+ cookiesList.append(lecc)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookie and lastExternalChangelogCookie -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Draft ChangeNumbers
+ #@TestID ecl_draft_changenumbers_002
+ #@TestPurpose Verify that the 2 servers have consistent changeNumber and lastChangeNumber
+ #@TestPreamble
+ #@TestSteps Step1: Check that the changeNumber and lastChangeNumber match
+
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_draft_changenumbers_002" scope="local">
+ <testcase name="getTestCaseName('ecl_draft_changenumbers_002')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Reset List -->
+ <script>
+ cnsList = []
+ lcnsList = []
+ </script>
+
+ <!-- Step1: Check that the changeNumber and lastChangeNumber match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeNumber and lastChangeNumber match.' }
+ </call>
+
+ <script>
+ mychangenumber = global_cnsList.get()
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : '(changenumber>=%s)' % mychangenumber,
+ 'dsAttributes' : 'changeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ cn = get_last_attr_from_entry(STAXResult,'changeNumber')
+ cnsList.append(cn)
+ global_cnsList.set(cn)
+ </script>
+
+ <!-- Search for lastChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lcn = get_last_attr_from_entry(STAXResult,'lastChangeNumber')
+ lcnsList.append(cn)
+ global_lcnsList.set(lcn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeNumber and lastChangeNumber -->
+ <call function="'compareItems'">
+ { 'items' : cnsList + lcnsList,
+ 'label' : 'changeNumbers'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Cookie
+ #@TestID ecl_cookies_003
+ #@TestPurpose Verify that after multiple changes to master all servers have consistent COOKIE
+ #@TestPreamble
+ #@TestSteps Step 1: Modify entries on one server
+ #@TestSteps Step 2: Check that the changeLogCookie and lastExternalChangelogCookie match
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_cookies_003" scope="local">
+ <testcase name="getTestCaseName('ecl_cookies_003')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <script>
+ cookiesList = []
+ nochanges = 0
+ </script>
+
+ <!-- Step 1: Modify entries on one server -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Modify entries on one server.' }
+ </call>
+
+ <loop from="1" to="2" var="entrynum">
+ <sequence>
+ <script>
+ myEntry = person_entry('cn=Change%s' % entrynum,synchroSuffix)
+ ldapObject=[]
+ </script>
+
+ <message>
+ 'Modify Entry (%s) on server %s:%s' \
+ % (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+
+ <loop from="1" to="2">
+ <sequence>
+
+ <script>
+ nochanges += 1
+ ldapObject.append('description:change %s on server %s' % (nochanges,entrynum))
+ </script>
+
+ </sequence>
+ </loop>
+
+ <call function="'modifyAnAttribute'">
+ { 'location' : masterHost,
+ 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'DNToModify' : myEntry.getDn() ,
+ 'listAttributes' : ldapObject ,
+ 'changetype' : 'replace' }
+ </call>
+
+ </sequence>
+ </loop>
+
+ <!-- Step2: Check that the changeLogCookie and lastExternalChangelogCookie match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeLogCookie and lastExternalChangelogCookie match.' }
+ </call>
+
+ <script>
+ mycookie = global_cookiesList.get()
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'dsControl' : '1.3.6.1.4.1.26027.1.5.4:false:%s' % mycookie,
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ global_cookiesList.set(clc)
+ </script>
+
+ <!-- Search for lastExternalChangelogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastExternalChangelogCookie',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lecc = get_last_attr_from_entry(STAXResult,'lastExternalChangelogCookie')
+ cookiesList.append(lecc)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookie and lastExternalChangelogCookie -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Draft ChangeNumbers
+ #@TestID ecl_draft_changenumbers_003
+ #@TestPurpose Verify that the servers have consistent changeNumbers
+ #@TestPreamble
+ #@TestSteps Step1: Check that the changeNumbers match
+ #@TestSteps Step2: Check that the lastChangeNumbers match
+ #@TestSteps Step3: Check that the firstChangeNumbers match
+
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_draft_changenumbers_003" scope="local">
+ <testcase name="getTestCaseName('ecl_draft_changenumbers_003')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Reset List -->
+ <script>
+ cnsList = []
+ </script>
+
+ <!-- Step1: Check that the changeNumber match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeNumber match.' }
+ </call>
+
+ <script>
+ mychangenumber = global_cnsList.get()
+ </script>
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'changeNumber>=%s' % mychangenumber,
+ 'dsAttributes' : 'changeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ cn = get_last_attr_from_entry(STAXResult,'changeNumber')
+ cnsList.append(cn)
+ global_cnsList.set(cn)
+ </script>
+ </sequence>
+ </iterate>
+
+ <!-- Step2: Check that the lastChangeNumber match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the lastChangeNumber match.' }
+ </call>
+
+ <script>
+ lcnsList = []
+ </script>
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for lastChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'lastChangeNumber>=%s' % mychangenumber,
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lcn = get_last_attr_from_entry(STAXResult,'lastChangeNumber')
+ cnsList.append(lcn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare lastChangeNumber -->
+ <call function="'compareItems'">
+ { 'items' : cnsList + lcnsList,
+ 'label' : 'changeNumbers'
+ }
+ </call>
+
+ <!-- Step3: Check that the firstChangeNumbers match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the firstChangeNumbers match.' }
+ </call>
+
+ <script>
+ fcnsList = []
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for firstChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsScope' : 'base',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'firstChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ fcn = get_last_attr_from_entry(STAXResult,'firstChangeNumber')
+ fcnsList.append(fcn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare firstChangeNumbers -->
+ <call function="'compareItems'">
+ { 'items' : fcnsList ,
+ 'label' : 'firstChangeNumber'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Purge Interval
+ #@TestID ecl_purge_sleep_001
+ #@TestPurpose Verify that purge interval is passed
+ #@TestPreamble
+ #@TestSteps Step1: Check that the changeNumbers match
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_purge_sleep_001" scope="local">
+ <testcase name="getTestCaseName('ecl_purge_sleep_001')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <script>
+ sleepMilliSeconds='%s000' % ecl_purge_delay
+ #TODO: change sleep time
+ #sleepMilliSeconds='1000'
+ </script>
+
+ <message>
+ 'Sleeping for %s secs' % ecl_purge_delay
+ </message>
+
+ <call function="'Sleep'">
+ { 'sleepForMilliSeconds' : sleepMilliSeconds }
+ </call>
+
+ <tcstatus result="'pass'"/>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Post Purge
+ #@TestID ecl_purge_001
+ #@TestPurpose Verify that the 2 servers have consistent cookies and changenumber after purge
+ #@TestPreamble
+ #@TestSteps Step1: Check that lastExternalChangelogCookie match
+ #@TestSteps Step2: Search on servers with last cookie
+ #@TestSteps Step3: Search on servers with changenumber (draft mode)
+ #@TestSteps Step4: Check that the lastChangeNumber match
+ #@TestSteps Step5: Check that the firstChangeNumbers match
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_purge_001" scope="local">
+ <testcase name="getTestCaseName('ecl_purge_001')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Modify Entries various replication servers -->
+ <script>
+ lastCookiesList = []
+ </script>
+
+ <!-- Step 1: Check that lastExternalChangelogCookie match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that lastExternalChangelogCookie match.' }
+ </call>
+
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for lastExternalChangelogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastExternalChangelogCookie',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lecc = get_last_attr_from_entry(STAXResult,'lastExternalChangelogCookie')
+ lastCookiesList.append(lecc)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare lastExternalChangelogCookie -->
+ <call function="'compareItems'">
+ { 'items' : lastCookiesList ,
+ 'label' : 'lastExternalChangelogCookie'
+ }
+ </call>
+
+ <!-- Step 2: Search on servers with last cookie -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Search on servers with last cookie.' }
+ </call>
+
+ <script>
+ cookiesList = []
+ i = 0
+ </script>
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'dsControl' : '1.3.6.1.4.1.26027.1.5.4:false:%s' % lastCookiesList[i],
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ i += 1
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookies -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookie'
+ }
+ </call>
+
+ <!-- Step 3: Search on servers with changenumber (draft mode) -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Search on servers with changenumber (draft mode).' }
+ </call>
+
+ <message>'Now checking draft mode.'</message>
+ <script>
+ mychangenumber = global_cnsList.get()
+ cookiesList = []
+ cnsList = []
+ </script>
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'changeNumber>=%s' % mychangenumber,
+ 'dsAttributes' : 'changeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ cn = get_last_attr_from_entry(STAXResult,'changeNumber')
+ cnsList.append(cn)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'changeNumber>=%s' % mychangenumber,
+ 'dsAttributes' : 'changeLogCookie',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ cn = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(cn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeNumbers -->
+ <call function="'compareItems'">
+ { 'items' : cnsList ,
+ 'label' : 'draftModeChangeNumber'
+ }
+ </call>
+
+ <!-- Compare changeLogCookies -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'draftModeChangeLogCookie'
+ }
+ </call>
+
+ <!-- Step4: Check that the lastChangeNumber match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the lastChangeNumber match.' }
+ </call>
+
+ <script>
+ lcnsList = []
+ i = 0
+ </script>
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for lastChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lcn = get_last_attr_from_entry(STAXResult,'lastChangeNumber')
+ lcnsList.append(lcn)
+ i += 1
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare lastChangeNumber -->
+ <call function="'compareItems'">
+ { 'items' : lcnsList,
+ 'label' : 'lastChangeNumber'
+ }
+ </call>
+
+ <!-- Step5: Check that the firstChangeNumbers match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the firstChangeNumbers match.' }
+ </call>
+
+ <script>
+ fcnsList = []
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for firstChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'firstChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ fcn = get_last_attr_from_entry(STAXResult,'firstChangeNumber')
+ fcnsList.append(fcn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare firstChangeNumbers -->
+ <call function="'compareItems'">
+ { 'items' : fcnsList ,
+ 'label' : 'firstChangeNumber'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Purge Masters Cookie
+ #@TestID ecl_purge_002
+ #@TestPurpose Verify that after purge change to master COOKIEs are consistent
+ #@TestPreamble
+ #@TestSteps Step1: Modify entry on one server
+ #@TestSteps Step2: Check that the changeLogCookie and lastExternalChangelogCookie match
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_purge_002" scope="local">
+ <testcase name="getTestCaseName('ecl_purge_002')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Step1: Modify entry on one server -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Modify entry on one server.' }
+ </call>
+
+ <script>
+ cookiesList = []
+ myEntry = person_entry('cn=Change1', synchroSuffix)
+ </script>
+
+ <message>
+ 'Modify Entry (%s) on server %s:%s' \
+ % (myEntry.getDn(), masterHost, master.getPort())
+ </message>
+
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : masterPath,
+ 'dsInstanceHost' : masterHost ,
+ 'dsInstancePort' : master.getPort() ,
+ 'dsInstanceDn' : master.getRootDn() ,
+ 'dsInstancePswd' : master.getRootPwd() ,
+ 'DNToModify' : myEntry.getDn() ,
+ 'attributeName' : 'description' ,
+ 'newAttributeValue' : 'this is a change on server 1',
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Step2: Check that the changeLogCookie and lastExternalChangelogCookie match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeLogCookie and lastExternalChangelogCookie match.' }
+ </call>
+
+ <script>
+ mycookie = global_cookiesList.get()
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'dsControl' : '1.3.6.1.4.1.26027.1.5.4:false:%s' % mycookie,
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ global_cookiesList.set(clc)
+ </script>
+
+ <!-- Search for lastExternalChangelogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastExternalChangelogCookie',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lecc = get_last_attr_from_entry(STAXResult,'lastExternalChangelogCookie')
+ cookiesList.append(lecc)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookie and lastExternalChangelogCookie -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Purge Consumers Cookie
+ #@TestID ecl_purge_003
+ #@TestPurpose Verify that after purge change to consumer COOKIEs are consistent
+ #@TestPreamble
+ #@TestSteps Step1: Modify entry on one server
+ #@TestSteps Step2: Check that the changeLogCookie and lastExternalChangelogCookie match
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_purge_003" scope="local">
+ <testcase name="getTestCaseName('ecl_purge_003')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Modify entry on one server -->
+ <script>
+ cookiesList = []
+ myEntry = person_entry('cn=Change1', synchroSuffix)
+
+ consumerServer = consumerList[0]
+ consumerServerPath = '%s/%s' % (consumerServer.getDir(), OPENDSNAME)
+ </script>
+
+ <message>
+ 'Modify Entry (%s) on server %s:%s' \
+ % (myEntry.getDn(), consumerServer.getHostname(), consumerServer.getPort())
+ </message>
+
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : consumerServerPath,
+ 'dsInstanceHost' : consumerServer.getHostname() ,
+ 'dsInstancePort' : consumerServer.getPort() ,
+ 'dsInstanceDn' : consumerServer.getRootDn() ,
+ 'dsInstancePswd' : consumerServer.getRootPwd() ,
+ 'DNToModify' : myEntry.getDn() ,
+ 'attributeName' : 'description' ,
+ 'newAttributeValue' : 'this is a change on server 2',
+ 'changetype' : 'add'
+ }
+ </call>
+
+ <!-- Check that the changeLogCookie and lastExternalChangelogCookie match -->
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'dsControl' : '1.3.6.1.4.1.26027.1.5.4:false:;',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ </script>
+
+ <!-- Search for lastExternalChangelogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'objectclass=*',
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastExternalChangelogCookie',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lecc = get_last_attr_from_entry(STAXResult,'lastExternalChangelogCookie')
+ cookiesList.append(lecc)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookie and lastExternalChangelogCookie -->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Purge ChangeNumbers
+ #@TestID ecl_purge_004
+ #@TestPurpose Verify that after purge the servers have consistent changeNumbers
+ #@TestPreamble
+ #@TestSteps Step1: Check that the changeNumbers match
+ #@TestSteps Step2: Check that the lastChangeNumbers match
+ #@TestSteps Step3: Check that the firstChangeNumbers match
+
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_purge_004" scope="local">
+ <testcase name="getTestCaseName('ecl_purge_004')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <!-- Reset List -->
+ <script>
+ mychangenumber = global_cnsList.get()
+ cnsList = []
+ </script>
+
+ <!-- Step1: Check that the changeNumber match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeNumber match.' }
+ </call>
+
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'changeNumber>=%s' % mychangenumber,
+ 'dsAttributes' : 'changeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ cn = get_last_attr_from_entry(STAXResult,'changeNumber')
+ cnsList.append(cn)
+ global_cnsList.set(cn)
+ </script>
+ </sequence>
+ </iterate>
+
+ <!-- Step2: Check that the lastChangeNumber match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the lastChangeNumber match.' }
+ </call>
+
+ <script>
+ lcnsList = []
+ mylastcn = global_lcnsList.get()
+ </script>
+ <iterate var="server" in="_topologyServerList" indexvar="i">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for lastChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsFilter' : 'lastChangeNumber>=%s' % mylastcn,
+ 'dsScope' : 'base',
+ 'dsAttributes' : 'lastChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ lcn = get_last_attr_from_entry(STAXResult,'lastChangeNumber')
+ cnsList.append(lcn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare lastChangeNumber -->
+ <call function="'compareItems'">
+ { 'items' : cnsList + lcnsList,
+ 'label' : 'changeNumbers'
+ }
+ </call>
+
+ <!-- Step3: Check that the firstChangeNumbers match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the firstChangeNumbers match.' }
+ </call>
+
+ <script>
+ fcnsList = []
+ </script>
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for firstChangeNumber -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : '',
+ 'dsScope' : 'base',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'firstChangeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ fcn = get_last_attr_from_entry(STAXResult,'firstChangeNumber')
+ fcnsList.append(fcn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare firstChangeNumbers -->
+ <call function="'compareItems'">
+ { 'items' : fcnsList ,
+ 'label' : 'firstChangeNumber'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL: Purge No Cookie or CN
+ #@TestID ecl_purge_005
+ #@TestPurpose Verify that change can be found with no cookie nor cn
+ #@TestPreamble
+ #@TestSteps Step 1: Search for changeLogCookie with no cookie in control
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_purge_005" scope="local">
+ <testcase name="getTestCaseName('ecl_purge_005')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <script>
+ cookiesList = []
+ cnsList = []
+ </script>
+
+ <!-- Step2: Check that the changeLogCookie and lastExternalChangelogCookie match -->
+ <call function="'testStep'">
+ { 'stepMessage' : 'Check that the changeLogCookie and lastExternalChangelogCookie match.' }
+ </call>
+
+ <iterate var="server" in="_topologyServerList">
+ <sequence>
+
+ <script>
+ replServer = server
+ replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
+ </script>
+
+ <!-- Search for changeLogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeLogCookie' ,
+ 'dsControl' : '1.3.6.1.4.1.26027.1.5.4:false:;',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ clc = get_last_attr_from_entry(STAXResult,'changeLogCookie')
+ cookiesList.append(clc)
+ </script>
+
+ <!-- Search for lastExternalChangelogCookie -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : replServer.getHostname(),
+ 'dsPath' : replServerPath,
+ 'dsInstanceHost' : replServer.getHostname(),
+ 'dsInstancePort' : replServer.getPort(),
+ 'dsInstanceDn' : replServer.getRootDn(),
+ 'dsInstancePswd' : replServer.getRootPwd(),
+ 'dsBaseDN' : 'cn=changelog',
+ 'dsFilter' : 'objectclass=*',
+ 'dsAttributes' : 'changeNumber',
+ 'extraParams' : '-T'
+ }
+ </call>
+
+ <script>
+ cn = get_last_attr_from_entry(STAXResult,'changeNumber')
+ cnsList.append(cn)
+ global_cnsList.set(cn)
+ </script>
+
+ </sequence>
+ </iterate>
+
+ <!-- Compare changeLogCookies-->
+ <call function="'compareItems'">
+ { 'items' : cookiesList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ <!-- Compare changeLogCookies-->
+ <call function="'compareItems'">
+ { 'items' : cnsList ,
+ 'label' : 'changeLogCookies'
+ }
+ </call>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!-- Definition of Postamble -->
+
+ <!--- Test Case : Replication : ECL : ECL CLEANUP -->
+ <!--- Test Case information
+ #@TestMarker Replication
+ #@TestName Replication : ECL
+ #@TestID ecl_cleanup
+ #@TestPurpose Cleanup ecl
+ #@TestPreamble
+ #@TestSteps Step1: TBD
+ #@TestPostamble
+ #@TestResult Test is successful if the result code is 0
+ -->
+ <function name="ecl_cleanup" scope="local">
+ <testcase name="getTestCaseName('ecl_cleanup')">
+ <sequence>
+ <try>
+ <sequence>
+ <call function="'testCase_Preamble'"/>
+ <message>
+ 'Test Name = %s' % STAXCurrentTestcase
+ </message>
+
+ <message>
+ 'Replication: External Changelog: - Clean up. \
+ Clean up environment for External Changelog tests'
+ </message>
+
+ <tcstatus result="'pass'"/>
+
+ </sequence>
+ <finally>
+ <call function="'testCase_Postamble'"/>
+ </finally>
+ </try>
+ </sequence>
+ </testcase>
+ </function>
+
+ <!-- Definition of Functions -->
+
+ <function name="compareItems" scope="local">
+ <function-prolog>
+ Compares all items in List for equality
+ </function-prolog>
+ <function-map-args>
+
+ <function-required-arg name="items">
+ List of items to be compared for equality
+ </function-required-arg>
+
+ <function-optional-arg name="label" default="''">
+ Friendly label to aid description
+ </function-optional-arg>
+ </function-map-args>
+
+ <sequence>
+ <if expr="len(items) == 0">
+ <message level='warning'>'The list to compare is empty.'</message>
+ </if>
+ <script>
+ try:
+ allItemsMatch = list_matches(items)
+ except Exception,e:
+ print "Exception Thrown: caught (%s)" % e
+ allItemsMatch = 'False'
+ </script>
+ <if expr="allItemsMatch == 'True'">
+ <sequence>
+ <message>'%s Items match successfully (%s)' % (label,items)</message>
+ <tcstatus result="'pass'"/>
+ </sequence>
+ <else>
+ <sequence>
+ <message level="'error'">'%s Items do not match (%s)' % (label,items)</message>
+ <tcstatus result="'fail'"/>
+ </sequence>
+ </else>
+ </if>
+ </sequence>
+ </function>
+</stax>
diff --git a/opends/tests/staf-tests/shared/functions/environment.xml b/opends/tests/staf-tests/shared/functions/environment.xml
index ce2a837..98fa45a 100755
--- a/opends/tests/staf-tests/shared/functions/environment.xml
+++ b/opends/tests/staf-tests/shared/functions/environment.xml
@@ -24,7 +24,7 @@
! CDDL HEADER END
!
! Copyright 2007-2010 Sun Microsystems, Inc.
- ! Portions Copyright 2011 ForgeRock AS
+ ! Portions Copyright 2011 ForgeRock AS.
! -->
<stax>
@@ -96,6 +96,7 @@
from replication import *
from snmp import *
from schema import *
+ from objects import *
</script>
diff --git a/opends/tests/staf-tests/shared/functions/ldap.xml b/opends/tests/staf-tests/shared/functions/ldap.xml
index c2fdb40..0edbe32 100755
--- a/opends/tests/staf-tests/shared/functions/ldap.xml
+++ b/opends/tests/staf-tests/shared/functions/ldap.xml
@@ -24,6 +24,7 @@
! CDDL HEADER END
!
! Copyright 2007-2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2011 ForgeRock AS.
! -->
<stax>
<function name="addEntry">
@@ -991,6 +992,8 @@
if dsBaseDN:
STAFCmdParamsList.append('-b "%s"' % dsBaseDN)
+ else:
+ STAFCmdParamsList.append('-b ""')
if dsContinueOnError:
STAFCmdParamsList.append('-c')
@@ -1027,7 +1030,7 @@
STAFCmdParamsList.append('-j %s' % dsBindPasswordFile)
if dsControl:
- STAFCmdParamsList.append('-J %s' % dsControl)
+ STAFCmdParamsList.append('-J "%s"' % dsControl)
if dsKeyStorePath:
STAFCmdParamsList.append('-K %s' % dsKeyStorePath)
diff --git a/opends/tests/staf-tests/shared/functions/utils.xml b/opends/tests/staf-tests/shared/functions/utils.xml
index f3307c2..72d0d58 100755
--- a/opends/tests/staf-tests/shared/functions/utils.xml
+++ b/opends/tests/staf-tests/shared/functions/utils.xml
@@ -24,6 +24,7 @@
! CDDL HEADER END
!
! Copyright 2007-2010 Sun Microsystems, Inc.
+ ! Portions Copyright 2011 ForgeRock AS.
! -->
<stax>
<function name="checkRC">
@@ -4106,5 +4107,32 @@
</sequence>
</function>
+<!-- TestStep -->
+ <function name="testStep">
+ <function-prolog>
+ This function print out a test step.
+ </function-prolog>
+
+ <function-map-args>
+ <function-arg-def name="stepMessage" type="required">
+ <function-arg-description>
+ test step message to display
+ </function-arg-description>
+ </function-arg-def>
+ </function-map-args>
+ <sequence>
+ <script>
+ try:
+ stepNumber=stepNumber
+ except NameError:
+ stepNumber=1
+ </script>
+ <message>'*** Step%s: %s' % (stepNumber,stepMessage)</message>
+ <script>
+ stepNumber += 1
+ </script>
+ </sequence>
+ </function>
+
</stax>
diff --git a/opends/tests/staf-tests/shared/python/common.py b/opends/tests/staf-tests/shared/python/common.py
index 914f9ac..5fcdff4 100644
--- a/opends/tests/staf-tests/shared/python/common.py
+++ b/opends/tests/staf-tests/shared/python/common.py
@@ -24,6 +24,7 @@
#
#
# Copyright 2007-2009 Sun Microsystems, Inc.
+# Portions Copyright 2011 ForgeRock AS.
__version__ = "$Revision$"
# $Source$
@@ -49,7 +50,10 @@
"java_properties",
"xmldoc_service" ,
"xml_create_report" ,
- "group_to_run" ]
+ "group_to_run" ,
+ "get_last_attr_from_entry" ,
+ "list_matches" ,
+ "count_attr" ]
class format_testcase:
'Format the Test name objects'
@@ -745,4 +749,44 @@
def getName(self):
return self.name
-
+def get_last_attr_from_entry(result,attribute):
+
+ changeEntry=result[0][1].split("\n")
+
+ attr=''
+ for changeAttr in changeEntry:
+ #print changeAttr
+ if changeAttr.startswith(attribute):
+ print 'get_last_attr_from_entry: %s' % changeAttr
+ attr = ' '.join(changeAttr.split(' ')[1:3])
+
+ return attr.replace(';','')
+
+def list_matches(mylist):
+
+ mycomp = 'True'
+ itemnum = 0
+
+ for item in mylist:
+ if not item:
+ # TODO: list item is empty do WARNING or ERROR
+ print "list_matches: WARNING: list item %s is empty." % itemnum
+ if item != mylist[0]:
+ print "list_matches: False. Match=(%s), Item=(%s)" % (mylist[0],item)
+ mycomp = 'False'
+ itemnum += 1
+
+ return mycomp
+
+def count_attr(result):
+
+ attrnum = 0
+ if result != None:
+
+ for attr in result[0][1].split('\n'):
+ if attr.startswith('dn:'):
+ print "Hit: attr (%s)" % attr
+ attrnum += 1
+
+ return attrnum
+
diff --git a/opends/tests/staf-tests/shared/python/objects.py b/opends/tests/staf-tests/shared/python/objects.py
new file mode 100644
index 0000000..8cbdd0e
--- /dev/null
+++ b/opends/tests/staf-tests/shared/python/objects.py
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+
+# 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/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/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 2011 ForgeRock AS.
+
+class person_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))
+
diff --git a/opends/tests/staf-tests/shared/tests/config.py.stubs b/opends/tests/staf-tests/shared/tests/config.py.stubs
index 4f6e4f9..09474c4 100644
--- a/opends/tests/staf-tests/shared/tests/config.py.stubs
+++ b/opends/tests/staf-tests/shared/tests/config.py.stubs
@@ -55,7 +55,7 @@
DIRECTORY_INSTANCE_SFX = 'dc=com'
DIRECTORY_INSTANCE_BE = 'userRoot'
REPLICATION_CONFIG_DIR = '${tests.run.dir}/${tests.run.time}/config'
-REPLICATION_SPLIT_SERVERS = '${replication.split}'
+REPLICATION_SPLIT_SERVERS = 'false'
REPLICATION_ECL_MODE = '${replication.eclmode}'
JAVA_HOME = '${remote.javahome}'
LOCAL_JAVA_HOME = '${local.javahome}'
--
Gitblit v1.10.0