From 185f28e4a1bccb9248783708609b982124e369dc Mon Sep 17 00:00:00 2001
From: ugaston <ugaston@localhost>
Date: Tue, 10 Jul 2007 20:50:17 +0000
Subject: [PATCH] New basic replication testcases + new shared functions library (tools.xml)
---
opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic.xml | 1480 ++++++++++++++++++++++++++++++-
opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic_setup.xml | 5
opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_cleanup.xml | 6
opendj-sdk/opends/tests/functional-tests/shared/data/replication/photo2.uu | 348 +++++++
opendj-sdk/opends/tests/functional-tests/shared/functions/ldap.xml | 10
opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_setup.xml | 18
opendj-sdk/opends/tests/functional-tests/shared/functions/tools.xml | 431 +++++++++
opendj-sdk/opends/tests/functional-tests/shared/functions/environment.xml | 2
opendj-sdk/opends/tests/functional-tests/shared/data/replication/photo1.uu | 361 +++++++
opendj-sdk/opends/tests/functional-tests/shared/python/replication.py | 55 +
10 files changed, 2,632 insertions(+), 84 deletions(-)
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/data/replication/photo1.uu b/opendj-sdk/opends/tests/functional-tests/shared/data/replication/photo1.uu
new file mode 100644
index 0000000..9ebf2bc
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/data/replication/photo1.uu
@@ -0,0 +1,361 @@
+ /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQ
+ QEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQ
+ kFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
+ T/wAARCAF6AScDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtR
+ AAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFh
+ cYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJip
+ KTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8v
+ P09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBA
+ QAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKj
+ U2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoq
+ OkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADA
+ MBAAIRAxEAPwD9MV/zxT1/zxQtDdR/KuWwC05e/Wk/zij7xzzzVAO9OlKnSlHTtS/5xQOwUUf5xR
+ QMKUfl70LS0BYP09qKKKACnLTactOwWFopD1FOPQUWFYFoagDNKBijYY3OOP0pVGD/AEp1FFxiL0
+ paKKQBSH64paKdwEH0xSNTqKLgMpD+NSU1qNwGH8KSnnoaQ9BSAbRRRQAjUm3NK1JQAhSkJzTqa1
+ K4DWopaKYEa0tA6UHv9KSIFHWnnoKSimOwq07/AD0pF5yPWl6celBQq/eH+FB+9SDoaVvvCgB3ak
+ pe1JQAUUU5aABfx/Cl/P8AGiiqQCj/AOvSj/69NopgK1Opq06pYBRRRSAKO4oooARe1Kf89aB+NB
+ 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
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/data/replication/photo2.uu b/opendj-sdk/opends/tests/functional-tests/shared/data/replication/photo2.uu
new file mode 100644
index 0000000..6d0e3e5
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/data/replication/photo2.uu
@@ -0,0 +1,348 @@
+ /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQ
+ QEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQ
+ kFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB
+ T/wAARCAF6AScDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtR
+ AAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFh
+ cYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJip
+ KTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8v
+ P09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBA
+ QAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKj
+ U2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoq
+ OkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADA
+ MBAAIRAxEAPwD2BTk//Xp45wTz70wAgU8dOBkVzghyZKj9OKDxQOKXHB+vrVliqDux3paQDnPtTs
+ joBQADrS5pMGgDBoAdQOtGKUA56UCsBz06r1pSORxR1pxPIoCw3g5p3JYZI4HFM5U596eoJYDPSg
+ T3FQZzgYoUYUlgfalU5Zj3H607cC2Ax9B6UhieWF6ckACkYhXYAYzz39KUnbyB8vYikY5Xdg9OaV
+ xXFT15xSgdR346ijnGT1B6etJGuw44yPemIccA5/Q9qQcNxyPc0pOGHel3E9f51I7hjPOcUf54oI
+ 9RS7TkjBJHpQJCDg5pMfNkcU7BAzQy468UFajCCz8ZyOnvSsBg54z6inAZOPWm5GQDj60DGEZXgA
+ 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
+ 8YPqKhCZoXBxnDHPdetFOuPlJxxwOlFa3IP//Z
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/functions/environment.xml b/opendj-sdk/opends/tests/functional-tests/shared/functions/environment.xml
index 1f37655..2c4d6d9 100755
--- a/opendj-sdk/opends/tests/functional-tests/shared/functions/environment.xml
+++ b/opendj-sdk/opends/tests/functional-tests/shared/functions/environment.xml
@@ -62,6 +62,8 @@
<import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
file="'%s/signals.xml' % (TESTS_FUNCTIONS_DIR)" />
+ <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
+ file="'%s/tools.xml' % (TESTS_FUNCTIONS_DIR)" />
</sequence>
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/functions/ldap.xml b/opendj-sdk/opends/tests/functional-tests/shared/functions/ldap.xml
index 491c112..91fa816 100755
--- a/opendj-sdk/opends/tests/functional-tests/shared/functions/ldap.xml
+++ b/opendj-sdk/opends/tests/functional-tests/shared/functions/ldap.xml
@@ -929,6 +929,12 @@
</function-arg-description>
<function-arg-property name="type" value="string"/>
</function-arg-def>
+ <function-arg-def name="outputFile" type="optional">
+ <function-arg-description>
+ Output file containing the search result in ldif format.
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
<function-arg-def name="expectedRC" type="optional" default="0">
<function-arg-description>
Expected return code value. Default value is 0
@@ -1103,9 +1109,11 @@
<envs>
['PATH=/bin:/usr/bin:%s' % dsBinPath, 'JAVA_HOME=%s' % JAVA_HOME]
</envs>
+ <stdout if="outputFile != None" mode="'replace'">'%s/../%s' % (dsPath,outputFile)</stdout>
<stderr mode="'stdout'"/>
<returnstdout/>
</process>
+
<script>
STAXCode=RC
STAXReason=STAXResult
@@ -2796,7 +2804,7 @@
STAFCmdParamsList.append('-a "%s"' % attributeName)
if newAttributeValue:
- STAFCmdParamsList.append('-v "%s"' % newAttributeValue)
+ STAFCmdParamsList.append('-v "%s"' % newAttributeValue)
if changetype:
STAFCmdParamsList.append('-t "%s"' % changetype)
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/functions/tools.xml b/opendj-sdk/opends/tests/functional-tests/shared/functions/tools.xml
new file mode 100644
index 0000000..8064f71
--- /dev/null
+++ b/opendj-sdk/opends/tests/functional-tests/shared/functions/tools.xml
@@ -0,0 +1,431 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../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-2007 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+
+
+ <!-- This function uses make ldif to generate LDIF data files -->
+ <function name="MakeLdif">
+ <function-prolog>
+ This function uses make ldif to generate LDIF data files
+ </function-prolog>
+
+ <function-map-args>
+ <function-arg-def name="location" type="optional" default="'%s' % STAXServiceMachine">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ <function-arg-property name="type" value="hostname"/>
+ </function-arg-def>
+ <function-arg-def name="dsPath" type="optional" default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)">
+ <function-arg-description>
+ Pathname to installation root
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
+ <function-arg-def name="version" type="optional">
+ <function-arg-description>
+ Display Directory Server version information
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="templateFile" type="optional">
+ <function-arg-description>
+ Path to the template file
+ </function-arg-description>
+ <function-arg-property name="type" value="filename"/>
+ </function-arg-def>
+ <function-arg-def name="ldifFile" type="optional">
+ <function-arg-description>
+ Path to the LDIF file
+ </function-arg-description>
+ <function-arg-property name="type" value="filename"/>
+ </function-arg-def>
+ <function-arg-def name="randomSeed " type="optional">
+ <function-arg-description>
+ The seed to use to initialize the random number generator
+ </function-arg-description>
+ <function-arg-property name="type" value="integer"/>
+ </function-arg-def>
+ <function-arg-def name="Help" type="optional">
+ <function-arg-description>
+ Help option
+ </function-arg-description>
+ <function-arg-property name="help" value="option"/>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
+ <!-- Build the Command -->
+ <script>
+ STAFCmdParamsList=[]
+ STAFCmdParams=''
+
+ if dsPath:
+ dsBinPath='%s/%s' % (dsPath,fileFolder)
+ STAFCmd='%s/make-ldif%s' % (dsBinPath,fileExt)
+
+ if version:
+ STAFCmdParamsList.append('-V')
+
+ if templateFile:
+ STAFCmdParamsList.append('-t %s' % templateFile)
+
+ if ldifFile:
+ STAFCmdParamsList.append('-o "%s"' % ldifFile)
+
+ if randomSeed:
+ STAFCmdParamsList.append('-s "%s"' % randomSeed)
+
+ if Help:
+ STAFCmdParamsList.append('-H')
+
+ STAFCmdParams=' '.join(STAFCmdParamsList)
+ </script>
+
+ <message>
+ '%s %s' % (STAFCmd, STAFCmdParams)
+ </message>
+
+ <process name="'Make Ldif Script'">
+ <location>'%s' % location</location>
+ <command>'%s' % STAFCmd</command>
+ <parms>'%s' % STAFCmdParams</parms>
+ <workdir>'%s' % dsBinPath</workdir>
+ <envs>
+ ['PATH=/bin:/usr/bin:%s' % dsBinPath, 'JAVA_HOME=%s' % JAVA_HOME]
+ </envs>
+ <console use="'same'"/>
+ <stderr mode="'stdout'"/>
+ <returnstdout/>
+ </process>
+
+ <script>
+ STAXCode, STAXReason=STAXResult
+ </script>
+ <if expr="STAXCode != 0">
+ <sequence>
+ <message level="'error'">
+ 'make-ldif failed (Code=%s,Reason=%s).' % (STAXCode,STAXReason)
+ </message>
+ </sequence>
+ </if>
+
+ <return>[STAXCode, STAXReason]</return>
+ </sequence>
+ </function>
+
+
+
+ <!-- This function starts DS using the start-ds script -->
+ <function name="LdifDiffWithScript">
+ <function-prolog>
+ This function compares two LDIF files and reports the differences in LDIF format
+ </function-prolog>
+ <function-map-args>
+ <function-arg-def name="location" type="optional" default="'%s' % STAXServiceMachine">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ <function-arg-property name="type" value="hostname"/>
+ </function-arg-def>
+ <function-arg-def name="dsPath" type="optional" default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)">
+ <function-arg-description>
+ Pathname to installation root
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
+ <function-arg-def name="version" type="optional">
+ <function-arg-description>
+ Display Directory Server version information
+ </function-arg-description>
+ <function-arg-property name="type" value="string"/>
+ </function-arg-def>
+ <function-arg-def name="sourceLdif" type="required">
+ <function-arg-description>
+ LDIF file to use as the source data
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
+ <function-arg-def name="targetLdif" type="required">
+ <function-arg-description>
+ LDIF file to use as the target data
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
+ <function-arg-def name="outputLdif" type="required">
+ <function-arg-description>
+ File to which the diffs should be written
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
+ <function-arg-def name="overwriteExisting" type="optional" default="True">
+ <function-arg-description>
+ Overwrite existing output file rather than append to it
+ </function-arg-description>
+ <function-arg-property name="type" value="option"/>
+ </function-arg-def>
+ <function-arg-def name="singleValueChanges" type="optional">
+ <function-arg-description>
+ Write each attribute-level change as a separate modification
+ per attribute value rather than one modification per entry
+ </function-arg-description>
+ <function-arg-property name="type" value="option"/>
+ </function-arg-def>
+ <function-arg-def name="Help" type="optional">
+ <function-arg-description>
+ Help option
+ </function-arg-description>
+ <function-arg-property name="help" value="option"/>
+ </function-arg-def>
+ </function-map-args>
+
+ <sequence>
+
+ <!-- Build the Command -->
+ <script>
+ STAFCmdParamsList=[]
+ STAFCmdParams=''
+
+ if dsPath:
+ dsBinPath='%s/%s' % (dsPath,fileFolder)
+ STAFCmd='%s/ldif-diff%s' % (dsBinPath,fileExt)
+
+ if version:
+ STAFCmdParamsList.append('-V')
+
+ if sourceLdif:
+ STAFCmdParamsList.append('-s %s' % sourceLdif)
+
+ if targetLdif:
+ STAFCmdParamsList.append('-t %s' % targetLdif)
+
+ if outputLdif:
+ STAFCmdParamsList.append('-o %s' % outputLdif)
+
+ if overwriteExisting:
+ STAFCmdParamsList.append('-O')
+
+ if singleValueChanges:
+ STAFCmdParamsList.append('-S')
+
+ if Help:
+ STAFCmdParamsList.append('-H')
+
+ STAFCmdParams=' '.join(STAFCmdParamsList)
+ </script>
+
+ <message>
+ '%s %s' % (STAFCmd, STAFCmdParams)
+ </message>
+
+ <process name="'LDIF Diff Script'">
+ <location>'%s' % location</location>
+ <command>'%s' % STAFCmd</command>
+ <parms>'%s' % STAFCmdParams</parms>
+ <workdir>'%s' % dsBinPath</workdir>
+ <envs>
+ ['PATH=/bin:/usr/bin:%s' % dsBinPath, 'JAVA_HOME=%s' % JAVA_HOME]
+ </envs>
+ <console use="'same'"/>
+ <stderr mode="'stdout'"/>
+ <returnstdout/>
+ <returnfile>outputLdif</returnfile>
+ </process>
+
+ <script>
+ STAXCode=RC
+ STAXReason=STAXResult
+ </script>
+ <script>
+ diffsInfo = STAXReason[1]
+ diffs = diffsInfo[1]
+ if (diffsInfo[0] == 0) and (diffs.startswith("# No differences were detected between the source and target LDIF files")) :
+ diffRC = 0
+ else:
+ diffRC = 1
+ </script>
+
+ <return> diffRC </return>
+
+ </sequence>
+
+ </function>
+
+
+
+
+ <function name="verifyTrees">
+ <function-prolog>
+ This function verifies that the trees in a group of ldap servers are synchronized.
+ </function-prolog>
+
+ <function-list-args>
+ <function-arg-def name="location" type="optional" default="'%s' % STAXServiceMachine">
+ <function-arg-description>
+ Location of target host
+ </function-arg-description>
+ <function-arg-property name="type" value="hostname"/>
+ </function-arg-def>
+ <function-arg-def name="dsPath" type="optional" default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)">
+ <function-arg-description>
+ Pathname to installation root
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
+ <function-arg-def name="referenceServer" type="required">
+ <function-arg-description>
+ Server that should be taken as reference.
+ </function-arg-description>
+ <function-arg-property name="type" value="Server"/>
+ </function-arg-def>
+ <function-arg-def name="serverList" type="required">
+ <function-arg-description>
+ List of the servers to verify against the referenceServer.
+ </function-arg-description>
+ <function-arg-property name="type" value="Server-list"/>
+ </function-arg-def>
+ <function-arg-def name="treeSuffix" type="required">
+ <function-arg-description>
+ Suffix of the tree to verify.
+ </function-arg-description>
+ <function-arg-property name="type" value="DN"/>
+ </function-arg-def>
+ </function-list-args>
+
+
+
+ <sequence>
+
+ <script>
+ myRC = 0
+ failedServers = []
+ failingServerList = ''
+ referenceTree = 'referenceTree.ldif'
+ sampleTree = 'sampleTree.ldif'
+ treeDiffs = 'treeDiffs.ldif'
+ </script>
+
+
+ <!-- Retrieve the tree from the reference server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : location,
+ 'dsPath' : dsPath,
+ 'dsInstanceHost' : referenceServer.getHostname() ,
+ 'dsInstancePort' : referenceServer.getPort() ,
+ 'dsInstanceDn' : referenceServer.getRootDn() ,
+ 'dsInstancePswd' : referenceServer.getRootPwd() ,
+ 'dsBaseDN' : treeSuffix,
+ 'dsFilter' : 'objectclass=*',
+ 'outputFile' : referenceTree }
+ </call>
+
+ <if expr="RC != 0">
+ <!-- If the reference tree could not be retrieved, return an error -->
+ <return> [1, None] </return>
+ </if>
+
+
+ <iterate var="server" in="serverList">
+ <sequence>
+ <!-- Retrieve the same tree for every other server in the list -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : location,
+ 'dsPath' : dsPath,
+ 'dsInstanceHost' : server.getHostname() ,
+ 'dsInstancePort' : server.getPort() ,
+ 'dsInstanceDn' : server.getRootDn() ,
+ 'dsInstancePswd' : server.getRootPwd() ,
+ 'dsBaseDN' : treeSuffix,
+ 'dsFilter' : 'objectclass=*',
+ 'outputFile' : sampleTree }
+ </call>
+
+ <if expr="RC == 0">
+ <sequence>
+
+ <!-- Compare this tree to the reference one -->
+ <call function="'LdifDiffWithScript'">
+ { 'location' : location,
+ 'dsPath' : dsPath,
+ 'sourceLdif' : '%s/../%s' % (dsPath, sampleTree),
+ 'targetLdif' : '%s/../%s' % (dsPath, referenceTree),
+ 'outputLdif' : '%s/../%s' % (dsPath, treeDiffs) }
+ </call>
+
+ <script>
+ if STAXResult != 0 :
+ failedServers.append('%s:%s' % (server.getHostname(), server.getPort()))
+ </script>
+
+ </sequence>
+ <else>
+ <script>
+ failedServers.append('%s:%s' % (server.getHostname(), server.getPort()))
+ </script>
+ </else>
+ </if>
+
+ </sequence>
+ </iterate>
+
+ <if expr="len(failedServers) > 0">
+ <!-- If at least one server failed to successfully compare to the reference tree,
+ ! return an error, along with the list of the servers that failed to do so -->
+ <script>
+ myRC = 1
+ comma = ','
+ failingServerList = 'List of non-synchronized servers (tree verify FAILED): %s ' % comma.join(failedServers)
+ </script>
+ <else>
+ <script>
+ failingServerList = 'All servers synchronized (tree verify SUCCEEDED).'
+ </script>
+ </else>
+ </if>
+
+
+ <call function="'checktestRC'">
+ { 'returncode' : myRC,
+ 'result' : failingServerList ,
+ 'expected' : 0 }
+ </call>
+
+ <return> [myRC, failedServers] </return>
+ </sequence>
+
+ </function>
+
+
+
+
+
+
+
+
+</stax>
diff --git a/opendj-sdk/opends/tests/functional-tests/shared/python/replication.py b/opendj-sdk/opends/tests/functional-tests/shared/python/replication.py
index af6f6ba..43a18bc 100644
--- a/opendj-sdk/opends/tests/functional-tests/shared/python/replication.py
+++ b/opendj-sdk/opends/tests/functional-tests/shared/python/replication.py
@@ -365,7 +365,35 @@
ldifLines.append('dn: %s' % dn)
ldifLines.append('changetype: modify')
ldifLines.append('%s: %s' % (mod_type,attr_type))
- ldifLines.append('%s: %s' % (attr_type,attr_value))
+ if attr_value != None :
+ ldifLines.append('%s: %s' % (attr_type,attr_value))
+
+
+ # write out the ldif file
+ outfile = open(path,"w")
+
+ for line in ldifLines:
+ outfile.write("%s\n" % line)
+
+ outfile.close()
+
+
+
+# Define the function that writes a ldif file with the modify to operate
+# on an entry in a given suffix.
+def write_replication_mod_binary_ldif_file(path, dn, mod_type, attr_type, binary_value_path):
+
+ # open file and read the binary value (which is encoded in base64)
+ binaryValueFile = open(binary_value_path, "r")
+ binaryValue = binaryValueFile.read()
+ binaryValueFile.close()
+
+ ldifLines = []
+
+ ldifLines.append('dn: %s' % dn)
+ ldifLines.append('changetype: modify')
+ ldifLines.append('%s: %s' % (mod_type,attr_type))
+ ldifLines.append('%s:: %s' % (attr_type,binaryValue))
# write out the ldif file
@@ -377,3 +405,28 @@
outfile.close()
+
+
+# Define the function that writes a ldif file with the modDN to operate
+# on an entry in a given suffix.
+def write_replication_moddn_ldif_file(path, dn, newrdn, newsuperior, deleteoldrdn):
+
+ ldifLines = []
+
+ ldifLines.append('dn: %s' % dn)
+ ldifLines.append('changetype: moddn')
+ ldifLines.append('newRDN: %s' % newrdn)
+ ldifLines.append('deleteOldRDN: %s' % deleteoldrdn)
+ if newsuperior != None:
+ ldifLines.append('newSuperior: %s' % newsuperior)
+
+
+
+ # write out the ldif file
+ outfile = open(path,"w")
+
+ for line in ldifLines:
+ outfile.write("%s\n" % line)
+
+ outfile.close()
+
diff --git a/opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic.xml b/opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic.xml
index 8ccd4d1..ecd6d83 100644
--- a/opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic.xml
+++ b/opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic.xml
@@ -33,7 +33,7 @@
<sequence>
- <block name="'basic'">
+ <block name="'basic'">
<sequence>
@@ -69,7 +69,8 @@
<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,
@@ -79,29 +80,25 @@
'dsInstancePswd' : server1.getRootPwd(),
'entryToBeAdded' : '%s/replication_add_root_suffix.ldif' % clientDataDir }
</call>
-
- <call function="'checkRC'">
- { 'returncode' : RC,
- 'result' : STAXResult }
- </call>
-
-
- <call function="'SearchObject'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server2.getHostname() ,
- 'dsInstancePort' : server2.getPort() ,
- 'dsInstanceDn' : server2.getRootDn() ,
- 'dsInstancePswd' : server2.getRootPwd() ,
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
'dsBaseDN' : synchroSuffix ,
'dsFilter' : 'objectclass=*' }
</call>
-
- <call function="'checktestRC'">
- { 'returncode' : RC,
- 'result' : STAXResult,
- 'expected' : 0 }
- </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
<call function="'testCase_Postamble'"/>
</sequence>
</testcase>
@@ -124,7 +121,9 @@
<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,
@@ -134,45 +133,44 @@
'dsInstancePswd' : server1.getRootPwd() ,
'entryToBeAdded' : '%s/replication_add_single.ldif' % clientDataDir }
</call>
-
- <call function="'checkRC'">
- { 'returncode' : RC ,
- 'result' : STAXResult }
- </call>
-
-
- <call function="'modifyEntry'">
+ <call function="'ldapModifyWithScript'">
{ 'location' : clientHost,
'dsPath' : clientPath,
'dsInstanceHost' : server1.getHostname() ,
'dsInstancePort' : server1.getPort() ,
'dsInstanceDn' : server1.getRootDn() ,
'dsInstancePswd' : server1.getRootPwd() ,
- 'entryToBeModified' : '%s/replication_mod.ldif' % clientDataDir }
+ 'dsFilename' : '%s/replication_mod.ldif' % clientDataDir }
</call>
-
- <call function="'checkRC'">
- { 'returncode' : RC ,
- 'result' : STAXResult }
- </call>
-
-
- <call function="'SearchObject'">
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
{ 'location' : clientHost,
'dsPath' : clientPath,
- 'dsInstanceHost' : server2.getHostname() ,
- 'dsInstancePort' : server2.getPort() ,
- 'dsInstanceDn' : server2.getRootDn() ,
- 'dsInstancePswd' : server2.getRootPwd() ,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
'dsBaseDN' : entryDn,
- 'dsFilter' : '%s=%s' % (attr_type,attr_value) }
+ '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' : RC ,
- 'result' : STAXResult ,
- 'expected' : 0 }
- </call>
+ { 'returncode' : resultLength ,
+ 'result' : searchResult ,
+ 'expected' : 1 }
+ </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], synchroSuffix ]
+ </call>
+
<call function="'testCase_Postamble'"/>
</sequence>
</testcase>
@@ -194,7 +192,9 @@
<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,
@@ -204,30 +204,1372 @@
'dsInstancePswd' : server1.getRootPwd() ,
'dsBaseDN' : entryDn }
</call>
-
- <call function="'checkRC'">
- { 'returncode' : RC ,
- 'result' : STAXResult }
- </call>
-
-
- <call function="'SearchObject'">
- { 'location' : clientHost,
- 'dsPath' : clientPath,
- 'dsInstanceHost' : server2.getHostname() ,
- 'dsInstancePort' : server2.getPort() ,
- 'dsInstanceDn' : server2.getRootDn() ,
- 'dsInstancePswd' : server2.getRootPwd() ,
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
'dsBaseDN' : entryDn,
'dsFilter' : 'objectclass=*' ,
- 'expectedRC' : 32
- }
- </call>
+ 'expectedRC' : 32 }
+ </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], 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
+ #@TestSteps
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : synchroSuffix }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'addEntry'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname(),
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'entryToBeAdded' : '%s/replication/Example.ldif' % clientDataDir }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : 'uid=scarter,ou=People,%s' % synchroSuffix,
+ 'dsFilter' : 'objectclass=*' }
+ </call>
+
+
+ <!-- Verify the synchronization of the trees among the servers in the topology -->
+ <call function="'verifyTrees'">
+ [ clientHost, clientPath, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' % (logsTestDataDir,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,logsTestDataDir,clientDataDir)
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (clientDataDir,filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (clientDataDir, filename) }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : 'uid=smason, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : 'roomNumber=*',
+ '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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : 'uid=jwalker, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : 'roomNumber=3915' ,
+ '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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : '&(postaladdress=Residence Parc Europe)(postaladdress=Appartement #6)(postaladdress=31 Rue General Mangin)(postaladdress=38100 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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : '|(postaladdress=Appartement #6)(postaladdress=38100 Grenoble)',
+ '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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToModify' : 'uid=jwallace, ou=People,%s' % synchroSuffix,
+ 'listAttributes' : valuesToReplace,
+ 'changetype' : 'replace' }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : '&(postaladdress=Residence Letilleuil)(postaladdress=18 rue Nicolas Chorier)',
+ '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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : 'postaladdress=38000 Grenoble',
+ '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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : 'postaladdress=Residence Letilleuil',
+ '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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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>
+
+
+ <script>
+ entryAttributes = []
+ entryAttributes.append('cn: Tom Fitter')
+ entryAttributes.append('sn: Fitter')
+ entryAttributes.append('givenname: Tom')
+ entryAttributes.append('objectclass: top')
+ entryAttributes.append('objectclass: person')
+ entryAttributes.append('objectclass: organizationalPerson')
+ entryAttributes.append('objectclass: inetOrgPerson')
+ entryAttributes.append('ou: Accounting')
+ entryAttributes.append('ou: People')
+ entryAttributes.append('l: Sunnyvale')
+ entryAttributes.append('uid: tfitter')
+ entryAttributes.append('mail: tfitter@example.com')
+ entryAttributes.append('telephonenumber: +1 804 555 8974')
+ entryAttributes.append('facsimiletelephonenumber: +1 804 555 1579')
+ entryAttributes.append('roomnumber: 2164')
+ entryAttributes.append('userpassword: hamstring')
+ entryAttributes.append('description: PROFESSION Tap Fitter and PLUMBER')
+
+ valuesToReplace = []
+ valuesToReplace.append('description: Profession Tap Fitter and Plumber')
+ </script>
+
+ <!-- Modify "master" server -->
+ <call function="'addAnEntry'">
+ { 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToAdd' : 'uid=tfitter, ou=People,%s' % synchroSuffix,
+ 'listAttributes' : entryAttributes }
+ </call>
+
+ <call function="'modifyAnAttribute'">
+ { 'dsPath' : server1Path,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort(),
+ 'dsInstanceDn' : server1.getRootDn(),
+ 'dsInstancePswd' : server1.getRootPwd(),
+ 'DNToModify' : 'uid=tfitter, ou=People,%s' % synchroSuffix,
+ 'listAttributes' : valuesToReplace,
+ 'changetype' : 'replace' }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsBaseDN' : 'uid=tfitter, ou=People,%s' % synchroSuffix,
+ 'dsFilter' : 'description=Profession Tap Fitter and Plumber',
+ '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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' % (logsTestDataDir,filename)
+ binaryFilePath = '%s/photo1.uu' % testsGroupDir
+ 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,logsTestDataDir,clientDataDir)
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (clientDataDir,filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (clientDataDir, filename) }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' % (logsTestDataDir,filename)
+ binaryFilePath = '%s/photo2.uu' % testsGroupDir
+ 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,logsTestDataDir,clientDataDir)
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (clientDataDir,filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (clientDataDir, filename) }
+ </call>
+
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' % (logsTestDataDir,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,logsTestDataDir,clientDataDir)
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (clientDataDir,filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (clientDataDir, filename) }
+ </call>
+
+ <!-- Check modify worked on "master" server -->
+ <call function="'ldapSearchWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' % (logsTestDataDir,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,logsTestDataDir,clientDataDir)
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (clientDataDir,filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (clientDataDir, 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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' % (logsTestDataDir,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,logsTestDataDir,clientDataDir)
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (clientDataDir,filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (clientDataDir, 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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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, server1, [server2], 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
+ #@TestPostamble
+ #@TestResult
+ -->
+ <testcase name="'Replication: Basic: 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' % (logsTestDataDir,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,logsTestDataDir,clientDataDir)
+ </message>
+ <call function="'copyFile'">
+ { 'srcfile' : filePath,
+ 'destfile' : '%s/%s' % (clientDataDir,filename),
+ 'remotehost' : client.getHostname() }
+ </call>
+
+ <!-- Modify "master" server -->
+ <call function="'ldapModifyWithScript'">
+ { 'location' : clientHost,
+ 'dsPath' : clientPath,
+ 'dsInstanceHost' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.getRootPwd() ,
+ 'dsFilename' : '%s/%s' % (clientDataDir, 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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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' : server1.getHostname() ,
+ 'dsInstancePort' : server1.getPort() ,
+ 'dsInstanceDn' : server1.getRootDn() ,
+ 'dsInstancePswd' : server1.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, server1, [server2], synchroSuffix ]
+ </call>
+
+
+ <call function="'testCase_Postamble'"/>
+ </sequence>
+ </testcase>
+
+
+
+
+
+
<import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
file="'%s/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
<call function="'replication_cleanup'" />
diff --git a/opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic_setup.xml b/opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic_setup.xml
index 966bcf7..734eba6 100644
--- a/opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic_setup.xml
+++ b/opendj-sdk/opends/tests/functional-tests/testcases/replication/basic/replication_basic_setup.xml
@@ -39,8 +39,10 @@
</message>
<script>
+ server1Path = '%s/%s' % (server1.getDir(),OPENDSNAME)
synchroSuffix = server1.getSynchronizedSuffixList()[0].getSuffixDn()
entryDn = 'uid=scarter,%s' % synchroSuffix
+ grandchildEntryDn = 'uid=scarter,ou=People,o=replication tests,%s' % synchroSuffix
mod_type = 'replace'
attr_type = 'roomnumber'
attr_value = '1111'
@@ -109,7 +111,8 @@
'destfile' : '%s/%s' % (clientDataDir,filename),
'remotehost' : client.getHostname() }
</call>
-
+
+
<call function="'checkRC'">
{ 'returncode' : RC ,
'result' : STAXResult }
diff --git a/opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_cleanup.xml b/opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_cleanup.xml
index d53677c..46c55c6 100644
--- a/opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_cleanup.xml
+++ b/opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_cleanup.xml
@@ -35,11 +35,7 @@
<block name="'replication-cleanup'">
- <sequence>
-
- <script>
- basicTopologyFile = '%s/config/replication/basic_topology.txt' % TESTS_DIR
- </script>
+ <sequence>
<!-- Stop the servers in the topology -->
<iterate var="server" in="_topologyServerList">
diff --git a/opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_setup.xml b/opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_setup.xml
index b80ec43..88d08e0 100644
--- a/opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_setup.xml
+++ b/opendj-sdk/opends/tests/functional-tests/testcases/replication/replication_setup.xml
@@ -30,23 +30,27 @@
<defaultcall function="replication_setup"/>
<function name="replication_setup">
-
+ <function-map-args>
+ <function-arg-def name="topologyFile" type="optional" default="'%s/config/replication/basic_topology.txt' % TESTS_DIR">
+ <function-arg-description>
+ Pathname to file describing the topology.
+ </function-arg-description>
+ <function-arg-property name="type" value="filepath"/>
+ </function-arg-def>
+ </function-map-args>
+
<sequence>
<block name="'replication-setup'">
<sequence>
-
- <script>
- basicTopologyFile = '%s/config/replication/basic_topology.txt' % TESTS_DIR
- </script>
<message>
- 'Create DS topology as described in %s' % basicTopologyFile
+ 'Create DS topology as described in %s' % topologyFile
</message>
<call function="'createTopology'">
- { 'topologyDescFile' : basicTopologyFile,
+ { 'topologyDescFile' : topologyFile,
'sharedDataFolder' : 'replication' }
</call>
--
Gitblit v1.10.0