mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Christophe Sovant
03.29.2009 81f1d65e0ca7e4542a597db4f28e65f84dbbcd47
opends/tests/staf-tests/functional-tests/testcases/indexes/after-add.filters
@@ -21,16 +21,16 @@
# CDDL HEADER END
#
#
#      Copyright 2007-2009 Sun Microsystems, Inc.
#      Copyright 2007-2008 Sun Microsystems, Inc.
#
uid subString uid=j* 0 2 INDEXED
uid subString (uid=j*) 0 2 INDEXED
l presence l=* 0 10 INDEXED
l presence (l=*) 0 10 INDEXED
l equality l=Cupertino 0 3 INDEXED
l equality (l=Cupertino) 0 3 INDEXED
l approximate (l~=ertino) 0 11 NOT-INDEXED
l substring (l=Cup*) 0 3 INDEXED
l substring l=Cup* 0 3 INDEXED
l substring l=*tino 0 11 NOT-INDEXED
l substring (l=*tino) 0 11 NOT-INDEXED
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
l presence l=* 0 INDEXED
l presence (l=*) 0 INDEXED
l equality l=Cupertino 0 INDEXED
l equality (l=Cupertino) 0 INDEXED
l approximate (l~=ertino) 0 NOT-INDEXED
l substring (l=Cup*) 0 INDEXED
l substring l=Cup* 0 INDEXED
l substring l=*tino 0 NOT-INDEXED
l substring (l=*tino) 0 NOT-INDEXED
opends/tests/staf-tests/functional-tests/testcases/indexes/after-modify.filters
@@ -21,9 +21,9 @@
# CDDL HEADER END
#
#
#      Copyright 2007-2009 Sun Microsystems, Inc.
#      Copyright 2007-2008 Sun Microsystems, Inc.
#
uid subString uid=j* 0 2 INDEXED
uid subString (uid=j*) 0 2 INDEXED
uid subString uid=*allace 0 1 INDEXED
uid subString (uid=*allace) 0 1 INDEXED
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
uid subString uid=*allace 0 INDEXED
uid subString (uid=*allace) 0 INDEXED
opends/tests/staf-tests/functional-tests/testcases/indexes/after-remove.filters
@@ -21,16 +21,16 @@
# CDDL HEADER END
#
#
#      Copyright 2007-2009 Sun Microsystems, Inc.
#      Copyright 2007-2008 Sun Microsystems, Inc.
#
uid subString uid=j* 0 2 INDEXED
uid subString (uid=j*) 0 2 INDEXED
l presence l=* 0 11 NOT-INDEXED
l presence (l=*) 0 11 NOT-INDEXED
l equality l=Cupertino 0 11 NOT-INDEXED
l equality (l=Cupertino) 0 11 NOT-INDEXED
l approximate (l~=ertino) 0 11 NOT-INDEXED
l substring (l=Cup*) 0 11 NOT-INDEXED
l substring l=Cup* 0 11 NOT-INDEXED
l substring l=*tino 0 11 NOT-INDEXED
l substring (l=*tino) 0 11 NOT-INDEXED
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
l presence l=* 0 NOT-INDEXED
l presence (l=*) 0 NOT-INDEXED
l equality l=Cupertino 0 NOT-INDEXED
l equality (l=Cupertino) 0 NOT-INDEXED
l approximate (l~=ertino) 0 NOT-INDEXED
l substring (l=Cup*) 0 NOT-INDEXED
l substring l=Cup* 0 NOT-INDEXED
l substring l=*tino 0 NOT-INDEXED
l substring (l=*tino) 0 NOT-INDEXED
opends/tests/staf-tests/functional-tests/testcases/indexes/before-add.filters
@@ -21,16 +21,16 @@
# CDDL HEADER END
#
#
#      Copyright 2007-2009 Sun Microsystems, Inc.
#      Copyright 2007-2008 Sun Microsystems, Inc.
#
uid subString uid=j* 0 2 INDEXED
uid subString (uid=j*) 0 2 INDEXED
l presence l=* 0 11 NOT-INDEXED
l presence (l=*) 0 11 NOT-INDEXED
l equality l=Cupertino 0 11 NOT-INDEXED
l equality (l=Cupertino) 0 11 NOT-INDEXED
l approximate (l~=ertino) 0 11 NOT-INDEXED
l substring (l=Cup*) 0 11 NOT-INDEXED
l substring l=Cup* 0 11 NOT-INDEXED
l substring l=*tino 0 11 NOT-INDEXED
l substring (l=*tino) 0 11 NOT-INDEXED
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
l presence l=* 0 NOT-INDEXED
l presence (l=*) 0 NOT-INDEXED
l equality l=Cupertino 0 NOT-INDEXED
l equality (l=Cupertino) 0 NOT-INDEXED
l approximate (l~=ertino) 0 NOT-INDEXED
l substring (l=Cup*) 0 NOT-INDEXED
l substring l=Cup* 0 NOT-INDEXED
l substring l=*tino 0 NOT-INDEXED
l substring (l=*tino) 0 NOT-INDEXED
opends/tests/staf-tests/functional-tests/testcases/indexes/before-modify.filters
@@ -21,9 +21,9 @@
# CDDL HEADER END
#
#
#      Copyright 2007-2009 Sun Microsystems, Inc.
#      Copyright 2007-2008 Sun Microsystems, Inc.
#
uid subString uid=j* 0 2 INDEXED
uid subString (uid=j*) 0 2 INDEXED
uid subString uid=*allace 0 11 NOT-INDEXED
uid subString (uid=*allace) 0 11 NOT-INDEXED
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
uid subString uid=*allace 0 NOT-INDEXED
uid subString (uid=*allace) 0 NOT-INDEXED
opends/tests/staf-tests/functional-tests/testcases/indexes/before-remove.filters
@@ -21,16 +21,16 @@
# CDDL HEADER END
#
#
#      Copyright 2007-2009 Sun Microsystems, Inc.
#      Copyright 2007-2008 Sun Microsystems, Inc.
#
uid subString uid=j* 0 2 INDEXED
uid subString (uid=j*) 0 2 INDEXED
l presence l=* 0 10 INDEXED
l presence (l=*) 0 10 INDEXED
l equality l=Cupertino 0 3 INDEXED
l equality (l=Cupertino) 0 3 INDEXED
l approximate (l~=ertino) 0 11 NOT-INDEXED
l substring (l=Cup*) 0 3 INDEXED
l substring l=Cup* 0 3 INDEXED
l substring l=*tino 0 11 NOT-INDEXED
l substring (l=*tino) 0 11 NOT-INDEXED
uid subString uid=j* 0 INDEXED
uid subString (uid=j*) 0 INDEXED
l presence l=* 0 INDEXED
l presence (l=*) 0 INDEXED
l equality l=Cupertino 0 INDEXED
l equality (l=Cupertino) 0 INDEXED
l approximate (l~=ertino) 0 NOT-INDEXED
l substring (l=Cup*) 0 INDEXED
l substring l=Cup* 0 INDEXED
l substring l=*tino 0 NOT-INDEXED
l substring (l=*tino) 0 NOT-INDEXED
opends/tests/staf-tests/functional-tests/testcases/indexes/indexes.xml
@@ -23,7 +23,7 @@
 !
 ! CDDL HEADER END
 !
 !      Copyright 2007-2009 Sun Microsystems, Inc.
 !      Copyright 2007-2008 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="main_indexes" />
@@ -643,12 +643,11 @@
        class indexTest:
          "Describes an index test with indexed attribute, filter to test with \
           and expected behaviour"
          def __init__(self, attribute,testName,filter,expectedValue,countEntries,isIndexed):
          def __init__(self, attribute,testName,filter,expectedValue,isIndexed):
            self.attribute = attribute
            self.name = testName
            self.filter = filter
            self.rc = expectedValue
            self.count = countEntries
            self.isIndexed=re.compile(r'[\r\n]').sub('',isIndexed)
            self.status='fail'
          
@@ -663,9 +662,6 @@
          
          def getRC(self):
            return self.rc
          def getCount(self):
            return self.count
            
          def getSearchString(self):
            if self.isIndexed.startswith('NOT'):
@@ -684,7 +680,6 @@
            description += 'test:: attribute=[%s]\n' % self.attribute
            description += 'test:: filter=[%s]\n' % self.filter
            description += 'test:: rc=[%s]\n' % self.rc
            description += 'test:: count=[%s]\n' % self.count
            description += 'test:: indexed=[%s]\n' % self.isIndexed
            return description
            
@@ -697,7 +692,7 @@
          else: 
            testLine = line.split(' ')
            indexTests.append(indexTest(testLine[0], testLine[1], testLine[2], 
                              testLine[3], testLine[4], testLine[5]))
                              testLine[3], testLine[4]))
        f.close()
          
        indexTestNumber=0
@@ -731,7 +726,6 @@
                  'dsBaseDN'         : 'ou=People,dc=example,%s' \
                                        % DIRECTORY_INSTANCE_SFX ,
                  'dsFilter'         : '%s' % test.getFilter(),
                  'extraParams'      : '--countEntries' ,
                  'attributes'       : 'debugsearchindex',
                  'expectedRC'       : 'noCheck'
                }
@@ -755,15 +749,6 @@
                 % (test.desc(), searchReturnCode, searchResultString, srt, 
                    test.getSearchString())
              </message>
              <call function="'searchString'">
                {
                'expectedString' : '# Total number of matching entries: %s' % test.getCount() ,
                'returnString'    : searchResultString ,
                'expectedRC'     : 0
                }
              </call>
              <tcstatus result="test.getStatus()" />
              <call function="'testCase_Postamble'" />
              <script>
opends/tests/staf-tests/functional-tests/testcases/indexes/search.filters
@@ -21,187 +21,187 @@
# CDDL HEADER END
#
#
#      Copyright 2007-2009 Sun Microsystems, Inc.
#      Copyright 2007-2008 Sun Microsystems, Inc.
#
uid presence uid=* 0 1 NOT-INDEXED
uid presence UID=* 0 11 NOT-INDEXED
uid presence uId=* 0 11 NOT-INDEXED
uid presence UiD=* 0 11 NOT-INDEXED
uid equality uid=jwallace 0 1 INDEXED
uid equality (uid=jwallace) 0 1 INDEXED
uid equality (&(uid=jwallace)) 0 1 INDEXED
uid equality (|(uid=jwallace)) 0 1 INDEXED
uid equality (&(&(uid=jwallace))) 0 1 INDEXED
uid equality (&(|(uid=jwallace))) 0 1 INDEXED
uid equality (|(&(uid=jwallace))) 0 1 INDEXED
uid equality (|(|(uid=jwallace))) 0 1 INDEXED
uid equality (|(|(uid=jwallace))) 0 1 INDEXED
uid substring uid=j* 0 2 INDEXED
uid substring (uid=j*) 0 2 INDEXED
uid substring uid=*allace 0 11 NOT-INDEXED
uid substring (uid=*allace) 0 11 NOT-INDEXED
uid substring (&(uid=*allace)) 0 11 NOT-INDEXED
uid substring (|(uid=*allace)) 0 11 NOT-INDEXED
uid substring (&(&(uid=*allace))) 0 11 NOT-INDEXED
uid substring (&(|(uid=*allace))) 0 11 NOT-INDEXED
uid substring (|(&(uid=*allace))) 0 11 NOT-INDEXED
uid substring (|(|(uid=*allace))) 0 11 NOT-INDEXED
uid substring uid=jw*ce 0 2 INDEXED
uid substring (uid=jw*ce) 0 2 INDEXED
uid approximate uid~=wallace 0 11 NOT-INDEXED
uid approximate uid~=jwalace 0 11 NOT-INDEXED
uid negate !(uid=jwallace) 0 11 NOT-INDEXED
uid negate (!(uid=jwallace)) 0 11 NOT-INDEXED
uid negate (!(&(uid=jwallace))) 0 11 NOT-INDEXED
uid negate (!(|(uid=jwallace))) 0 11 NOT-INDEXED
uid complexAnd (uid=j*&l=sunnyvale) 0 2 INDEXED
uid complexAnd &(uid=j*)(l=sunnyvale) 0 2 NOT-INDEXED
uid complexAnd (&(uid=j*)(l=~sunyvale)) 0 2 NOT-INDEXED
uid complexAnd (&(&(uid=j*)(l=~sunyvale))) 0 2 NOT-INDEXED
uid complexAnd (uid=j*&!l=cupertino) 0 2 INDEXED
uid complexAnd (uid=j*&l=sun*) 0 2 INDEXED
uid complexAnd (&(uid=j*)(l=sun*)) 0 2 INDEXED
uid complexOr (uid=jwallace|uid=jwalker) 0 0 INDEXED
uid complexOr (uid=jwallace|l=Sun*) 0 0 INDEXED
uid complexOr (uid=jwallace|l=~unnyvale) 0 0 INDEXED
uid complexOr (uid=jwallace|!l=Cupertino) 0 0 INDEXED
uid complexOr (uid=jwallace|!l=Cuper*) 0 0 INDEXED
uid complexOr (uid=j*|l=sunnyvale) 0 2 INDEXED
uid complexOr (uid=j*|!l=Cupertino) 0 2 INDEXED
uid complexOr (uid=j*|!l=Cuper*) 0 2 INDEXED
uid complexOr (uid=j*|!l~=Cuperino) 0 2 INDEXED
uid complexOr (uid=j*|l~=sunyvale) 0 2 INDEXED
uid complexOr (|(uid=j*)(l=sunnyvale)) 0 11 INDEXED
uid complexOr (|(&(uid=j*)(uid=*lace))) 0 2 INDEXED
sn presence sn=* 0 11 NOT-INDEXED
sn presence SN=* 0 11 NOT-INDEXED
sn presence sN=* 0 11 NOT-INDEXED
sn presence Sn=* 0 11 NOT-INDEXED
sn equality sn=Bergin 0 1 INDEXED
sn equality (sn=Bergin) 0 1 INDEXED
sn substring sn=Ber* 0 1 INDEXED
sn substring (sn=Ber*) 0 1 INDEXED
sn substring sn=*ergin 0 1 INDEXED
sn substring (sn=*ergin) 0 1 INDEXED
sn substring sn=*ergi* 0 1 INDEXED
sn substring (sn=*ergi*) 0 1 INDEXED
sn approximate sn~=begin 0 11 NOT-INDEXED
sn approximate (sn~=begin) 0 11 NOT-INDEXED
mail presence mail=* 0 11 NOT-INDEXED
mail presence Mail=* 0 11 NOT-INDEXED
mail presence MAIL=* 0 11 NOT-INDEXED
mail presence mAiL=* 0 11 NOT-INDEXED
mail equality mail=kvaughan@example.com 0 1 INDEXED
mail equality (mail=kvaughan@example.com) 0 1 INDEXED
mail substring mail=kvaughan* 0 1 INDEXED
mail substring (mail=kvaughan*) 0 1 INDEXED
mail substring mail=*aughan@example.com 0 10 INDEXED
mail substring (mail=*aughan@example.com) 0 10 INDEXED
mail substring mail=*aughan@example.* 0 10 INDEXED
mail substring (mail=*aughan@example.*) 0 10 INDEXED
givenName presence givenName=* 0 11 NOT-INDEXED
givenName presence (givenName=*) 0 11 NOT-INDEXED
givenName presence givenname=* 0 11 NOT-INDEXED
givenName presence (givenname=*) 0 11 NOT-INDEXED
givenName presence GIVENNAME=* 0 11 NOT-INDEXED
givenName presence (GIVENNAME=*) 0 11 NOT-INDEXED
givenName presence GivenName=* 0 11 NOT-INDEXED
givenName presence (GivenName=*) 0 11 NOT-INDEXED
givenName presence GiVeNnaMe=* 0 11 NOT-INDEXED
givenName presence (GiVeNnaMe=*) 0 11 NOT-INDEXED
givenName presence gIvEnNaMe=* 0 11 NOT-INDEXED
givenName presence (gIvEnNaMe=*) 0 11 NOT-INDEXED
givenName equality givenName=kirsten 0 1 INDEXED
givenName equality (givenName=kirsten) 0 1 INDEXED
givenName equality givenName=Kirsten 0 1 INDEXED
givenName equality (givenName=Kirsten) 0 1 INDEXED
givenName equality givenname=kirsten 0 1 INDEXED
givenName equality (givenname=kirsten) 0 1 INDEXED
givenName equality givenname=KIRSTEN 0 1 INDEXED
givenName equality (givenname=KIRSTEN) 0 1 INDEXED
givenName equality GIVENNAME=kirsten 0 1 INDEXED
givenName equality (GIVENNAME=kirsten) 0 1 INDEXED
givenName equality GIVENNAME=KIRSTEN 0 1 INDEXED
givenName equality (GIVENNAME=KIRSTEN) 0 1 INDEXED
givenName equality gIvEnNaMe=kIrStEn 0 1 INDEXED
givenName equality (gIvEnNaMe=kIrStEn) 0 1 INDEXED
givenName substring givenName=kirst* 0 1 INDEXED
givenName substring (givenName=kirst*) 0 1 INDEXED
givenName substring GivenName=kirst* 0 1 INDEXED
givenName substring (GivenName=kirst*) 0 1 INDEXED
givenName substring givenname=kirst* 0 1 INDEXED
givenName substring (givenname=kirst*) 0 1 INDEXED
givenName substring GIVENNAME=kirst* 0 1 INDEXED
givenName substring (GIVENNAME=kirst*) 0 1 INDEXED
givenName substring givenName=*rsten 0 1 INDEXED
givenName substring (givenName=*rsten) 0 1 INDEXED
givenName substring GivenName=*rsten 0 1 INDEXED
givenName substring (GivenName=*rsten) 0 1 INDEXED
givenName substring givenname=*rsten 0 1 INDEXED
givenName substring (givenname=*rsten) 0 1 INDEXED
givenName substring givenName=*rste* 0 1 INDEXED
givenName substring (givenName=*rste*) 0 1 INDEXED
givenName substring GivenName=*rste* 0 1 INDEXED
givenName substring (GivenName=*rste*) 0 1 INDEXED
givenName substring GIVENNAME=*rste* 0 1 INDEXED
givenName substring (GIVENNAME=*rste*) 0 1 INDEXED
cn presence cn=* 0 11 NOT-INDEXED
cn presence (cn=*) 0 11 NOT-INDEXED
cn presence CN=* 0 11 NOT-INDEXED
cn presence (CN=*) 0 11 NOT-INDEXED
cn presence Cn=* 0 11 NOT-INDEXED
cn presence (Cn=*) 0 11 NOT-INDEXED
cn substring cn=Andy* 0 1 INDEXED
cn substring (cn=Andy*) 0 1 INDEXED
cn substring cn=andy* 0 1 INDEXED
cn substring (cn=andy*) 0 1 INDEXED
cn substring CN=aNDY* 0 1 INDEXED
cn substring (CN=aNDY*) 0 1 INDEXED
cn substring cN=andy* 0 1 INDEXED
cn substring (cN=andy*) 0 1 INDEXED
cn substring cn=andy* 0 1 INDEXED
cn substring cn=*ergin 0 1 INDEXED
cn substring (cn=*ergin) 0 1 INDEXED
cn substring cn=*Bergin 0 1 INDEXED
cn substring (cn=*Bergin) 0 1 INDEXED
cn substring cN=*Bergin 0 1 INDEXED
cn substring (cN=*Bergin) 0 1 INDEXED
cn substring cn=*bERGIN 0 1 INDEXED
cn substring (cn=*bERGIN) 0 1 INDEXED
cn substring CN=*bERGIN 0 1 INDEXED
cn substring (CN=*bERGIN) 0 1 INDEXED
cn substring (CN=*bERGIN) 0 1 INDEXED
cn substring (cn=and*rgin) 0 1 INDEXED
cn substring (cn=aN*bErGiN) 0 1 INDEXED
telephoneNumber presence telephoneNumber=* 0 11 NOT-INDEXED
telephoneNumber presence (telephoneNumber=*) 0 11 NOT-INDEXED
telephoneNumber presence telephonenumber=* 0 11 NOT-INDEXED
telephoneNumber presence (telephonenumber=*) 0 11 NOT-INDEXED
telephoneNumber presence TelephoneNumber=* 0 11 NOT-INDEXED
telephoneNumber presence (TelephoneNumber=*) 0 11 NOT-INDEXED
telephoneNumber presence TELEPHONENUMBER=* 0 11 NOT-INDEXED
telephoneNumber presence (TELEPHONENUMBER=*) 0 11 NOT-INDEXED
telephoneNumber presence (&(TELEPHONENUMBER=*)) 0 11 NOT-INDEXED
telephoneNumber presence (|(TELEPHONENUMBER=*)) 0 11 NOT-INDEXED
telephoneNumber presence (&(&(TELEPHONENUMBER=*))) 0 11 NOT-INDEXED
telephoneNumber presence (|(|(TELEPHONENUMBER=*))) 0 11 NOT-INDEXED
telephoneNumber presence (&(|(TELEPHONENUMBER=*))) 0 11 NOT-INDEXED
telephoneNumber presence (|(&(TELEPHONENUMBER=*))) 0 11 NOT-INDEXED
telephoneNumber substring telephoneNumber=*8585 0 1 INDEXED
telephoneNumber substring (telephoneNumber=*8585) 0 1 INDEXED
telephoneNumber substring telephoneNumber=+1* 0 10 INDEXED
telephoneNumber substring (telephoneNumber=+1*) 0 10 INDEXED
telephoneNumber substring telephoneNumber=*408* 0 10 INDEXED
telephoneNumber substring (telephoneNumber=*408*) 0 10 INDEXED
telephoneNumber substring telephoneNumber=+1*8585 0 10 INDEXED
telephoneNumber substring (telephoneNumber=+1*8585) 0 10 INDEXED
telephoneNumber substring telephoneNumber=+1*08*8585 0 10 INDEXED
telephoneNumber substring (telephoneNumber=+1*08*8585) 0 10 INDEXED
telephoneNumber substring (&(telephoneNumber=+1*08*8585)) 0 10 INDEXED
telephoneNumber substring (|(telephoneNumber=+1*08*8585)) 0 10 INDEXED
telephoneNumber substring (&(&(telephoneNumber=+1*08*8585))) 0 10 INDEXED
telephoneNumber substring (&(|(telephoneNumber=+1*08*8585))) 0 10 INDEXED
telephoneNumber substring (|(&(telephoneNumber=+1*08*8585))) 0 10 INDEXED
telephoneNumber substring (|(|(|(|(|(|(|(telephoneNumber=+1*08*8585)))))))) 0 10 INDEXED
telephoneNumber substring (&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(telephoneNumber=+1*08*8585)))))))))))))))) 0 10 INDEXED
telephoneNumber substring (&(|(&(|(&(|(&(|(&(|(&(|(&(|(&(|(telephoneNumber=+1*08*8585))))))))))))))))) 0 10 INDEXED
uid presence uid=* 0 NOT-INDEXED
uid presence UID=* 0 NOT-INDEXED
uid presence uId=* 0 NOT-INDEXED
uid presence UiD=* 0 NOT-INDEXED
uid equality uid=jwallace 0 INDEXED
uid equality (uid=jwallace) 0 INDEXED
uid equality (&(uid=jwallace)) 0 INDEXED
uid equality (|(uid=jwallace)) 0 INDEXED
uid equality (&(&(uid=jwallace))) 0 INDEXED
uid equality (&(|(uid=jwallace))) 0 INDEXED
uid equality (|(&(uid=jwallace))) 0 INDEXED
uid equality (|(|(uid=jwallace))) 0 INDEXED
uid equality (|(|(uid=jwallace))) 0 INDEXED
uid substring uid=j* 0 INDEXED
uid substring (uid=j*) 0 INDEXED
uid substring uid=*allace 0 NOT-INDEXED
uid substring (uid=*allace) 0 NOT-INDEXED
uid substring (&(uid=*allace)) 0 NOT-INDEXED
uid substring (|(uid=*allace)) 0 NOT-INDEXED
uid substring (&(&(uid=*allace))) 0 NOT-INDEXED
uid substring (&(|(uid=*allace))) 0 NOT-INDEXED
uid substring (|(&(uid=*allace))) 0 NOT-INDEXED
uid substring (|(|(uid=*allace))) 0 NOT-INDEXED
uid substring uid=jw*ce 0 INDEXED
uid substring (uid=jw*ce) 0 INDEXED
uid approximate uid~=wallace 0 NOT-INDEXED
uid approximate uid~=jwalace 0 NOT-INDEXED
uid negate !(uid=jwallace) 0 NOT-INDEXED
uid negate (!(uid=jwallace)) 0 NOT-INDEXED
uid negate (!(&(uid=jwallace))) 0 NOT-INDEXED
uid negate (!(|(uid=jwallace))) 0 NOT-INDEXED
uid complexAnd (uid=j*&l=sunnyvale) 0 INDEXED
uid complexAnd &(uid=j*)(l=sunnyvale) 0 NOT-INDEXED
uid complexAnd (&(uid=j*)(l=~sunyvale)) 0 NOT-INDEXED
uid complexAnd (&(&(uid=j*)(l=~sunyvale))) 0 NOT-INDEXED
uid complexAnd (uid=j*&!l=cupertino) 0 INDEXED
uid complexAnd (uid=j*&l=sun*) 0 INDEXED
uid complexAnd (&(uid=j*)(l=sun*)) 0 INDEXED
uid complexOr (uid=jwallace|uid=jwalker) 0 INDEXED
uid complexOr (uid=jwallace|l=Sun*) 0 INDEXED
uid complexOr (uid=jwallace|l=~unnyvale) 0 INDEXED
uid complexOr (uid=jwallace|!l=Cupertino) 0 INDEXED
uid complexOr (uid=jwallace|!l=Cuper*) 0 INDEXED
uid complexOr (uid=j*|l=sunnyvale) 0 INDEXED
uid complexOr (uid=j*|!l=Cupertino) 0 INDEXED
uid complexOr (uid=j*|!l=Cuper*) 0 INDEXED
uid complexOr (uid=j*|!l~=Cuperino) 0 INDEXED
uid complexOr (uid=j*|l~=sunyvale) 0 INDEXED
uid complexOr (|(uid=j*)(l=sunnyvale)) 0 INDEXED
uid complexOr (|(&(uid=j*)(uid=*lace))) 0 INDEXED
sn presence sn=* 0 NOT-INDEXED
sn presence SN=* 0 NOT-INDEXED
sn presence sN=* 0 NOT-INDEXED
sn presence Sn=* 0 NOT-INDEXED
sn equality sn=Bergin 0 INDEXED
sn equality (sn=Bergin) 0 INDEXED
sn substring sn=Ber* 0 INDEXED
sn substring (sn=Ber*) 0 INDEXED
sn substring sn=*ergin 0 INDEXED
sn substring (sn=*ergin) 0 INDEXED
sn substring sn=*ergi* 0 INDEXED
sn substring (sn=*ergi*) 0 INDEXED
sn approximate sn~=begin 0 NOT-INDEXED
sn approximate (sn~=begin) 0 NOT-INDEXED
mail presence mail=* 0 NOT-INDEXED
mail presence Mail=* 0 NOT-INDEXED
mail presence MAIL=* 0 NOT-INDEXED
mail presence mAiL=* 0 NOT-INDEXED
mail equality mail=kvaughan@example.com 0 INDEXED
mail equality (mail=kvaughan@example.com) 0 INDEXED
mail substring mail=kvaughan* 0 INDEXED
mail substring (mail=kvaughan*) 0 INDEXED
mail substring mail=*aughan@example.com 0 INDEXED
mail substring (mail=*aughan@example.com) 0 INDEXED
mail substring mail=*aughan@example.* 0 INDEXED
mail substring (mail=*aughan@example.*) 0 INDEXED
givenName presence givenName=* 0 NOT-INDEXED
givenName presence (givenName=*) 0 NOT-INDEXED
givenName presence givenname=* 0 NOT-INDEXED
givenName presence (givenname=*) 0 NOT-INDEXED
givenName presence GIVENNAME=* 0 NOT-INDEXED
givenName presence (GIVENNAME=*) 0 NOT-INDEXED
givenName presence GivenName=* 0 NOT-INDEXED
givenName presence (GivenName=*) 0 NOT-INDEXED
givenName presence GiVeNnaMe=* 0 NOT-INDEXED
givenName presence (GiVeNnaMe=*) 0 NOT-INDEXED
givenName presence gIvEnNaMe=* 0 NOT-INDEXED
givenName presence (gIvEnNaMe=*) 0 NOT-INDEXED
givenName equality givenName=kirsten 0 INDEXED
givenName equality (givenName=kirsten) 0 INDEXED
givenName equality givenName=Kirsten 0 INDEXED
givenName equality (givenName=Kirsten) 0 INDEXED
givenName equality givenname=kirsten 0 INDEXED
givenName equality (givenname=kirsten) 0 INDEXED
givenName equality givenname=KIRSTEN 0 INDEXED
givenName equality (givenname=KIRSTEN) 0 INDEXED
givenName equality GIVENNAME=kirsten 0 INDEXED
givenName equality (GIVENNAME=kirsten) 0 INDEXED
givenName equality GIVENNAME=KIRSTEN 0 INDEXED
givenName equality (GIVENNAME=KIRSTEN) 0 INDEXED
givenName equality gIvEnNaMe=kIrStEn 0 INDEXED
givenName equality (gIvEnNaMe=kIrStEn) 0 INDEXED
givenName substring givenName=kirst* 0 INDEXED
givenName substring (givenName=kirst*) 0 INDEXED
givenName substring GivenName=kirst* 0 INDEXED
givenName substring (GivenName=kirst*) 0 INDEXED
givenName substring givenname=kirst* 0 INDEXED
givenName substring (givenname=kirst*) 0 INDEXED
givenName substring GIVENNAME=kirst* 0 INDEXED
givenName substring (GIVENNAME=kirst*) 0 INDEXED
givenName substring givenName=*rsten 0 INDEXED
givenName substring (givenName=*rsten) 0 INDEXED
givenName substring GivenName=*rsten 0 INDEXED
givenName substring (GivenName=*rsten) 0 INDEXED
givenName substring givenname=*rsten 0 INDEXED
givenName substring (givenname=*rsten) 0 INDEXED
givenName substring givenName=*rste* 0 INDEXED
givenName substring (givenName=*rste*) 0 INDEXED
givenName substring GivenName=*rste* 0 INDEXED
givenName substring (GivenName=*rste*) 0 INDEXED
givenName substring GIVENNAME=*rste* 0 INDEXED
givenName substring (GIVENNAME=*rste*) 0 INDEXED
cn presence cn=* 0 NOT-INDEXED
cn presence (cn=*) 0 NOT-INDEXED
cn presence CN=* 0 NOT-INDEXED
cn presence (CN=*) 0 NOT-INDEXED
cn presence Cn=* 0 NOT-INDEXED
cn presence (Cn=*) 0 NOT-INDEXED
cn substring cn=Andy* 0 INDEXED
cn substring (cn=Andy*) 0 INDEXED
cn substring cn=andy* 0 INDEXED
cn substring (cn=andy*) 0 INDEXED
cn substring CN=aNDY* 0 INDEXED
cn substring (CN=aNDY*) 0 INDEXED
cn substring cN=andy* 0 INDEXED
cn substring (cN=andy*) 0 INDEXED
cn substring cn=andy* 0 INDEXED
cn substring cn=*ergin 0 INDEXED
cn substring (cn=*ergin) 0 INDEXED
cn substring cn=*Bergin 0 INDEXED
cn substring (cn=*Bergin) 0 INDEXED
cn substring cN=*Bergin 0 INDEXED
cn substring (cN=*Bergin) 0 INDEXED
cn substring cn=*bERGIN 0 INDEXED
cn substring (cn=*bERGIN) 0 INDEXED
cn substring CN=*bERGIN 0 INDEXED
cn substring (CN=*bERGIN) 0 INDEXED
cn substring (CN=*bERGIN) 0 INDEXED
cn substring (cn=and*rgin) 0 INDEXED
cn substring (cn=aN*bErGiN) 0 INDEXED
telephoneNumber presence telephoneNumber=* 0 NOT-INDEXED
telephoneNumber presence (telephoneNumber=*) 0 NOT-INDEXED
telephoneNumber presence telephonenumber=* 0 NOT-INDEXED
telephoneNumber presence (telephonenumber=*) 0 NOT-INDEXED
telephoneNumber presence TelephoneNumber=* 0 NOT-INDEXED
telephoneNumber presence (TelephoneNumber=*) 0 NOT-INDEXED
telephoneNumber presence TELEPHONENUMBER=* 0 NOT-INDEXED
telephoneNumber presence (TELEPHONENUMBER=*) 0 NOT-INDEXED
telephoneNumber presence (&(TELEPHONENUMBER=*)) 0 NOT-INDEXED
telephoneNumber presence (|(TELEPHONENUMBER=*)) 0 NOT-INDEXED
telephoneNumber presence (&(&(TELEPHONENUMBER=*))) 0 NOT-INDEXED
telephoneNumber presence (|(|(TELEPHONENUMBER=*))) 0 NOT-INDEXED
telephoneNumber presence (&(|(TELEPHONENUMBER=*))) 0 NOT-INDEXED
telephoneNumber presence (|(&(TELEPHONENUMBER=*))) 0 NOT-INDEXED
telephoneNumber substring telephoneNumber=*8585 0 INDEXED
telephoneNumber substring (telephoneNumber=*8585) 0 INDEXED
telephoneNumber substring telephoneNumber=+1* 0 INDEXED
telephoneNumber substring (telephoneNumber=+1*) 0 INDEXED
telephoneNumber substring telephoneNumber=*408* 0 INDEXED
telephoneNumber substring (telephoneNumber=*408*) 0 INDEXED
telephoneNumber substring telephoneNumber=+1*8585 0 INDEXED
telephoneNumber substring (telephoneNumber=+1*8585) 0 INDEXED
telephoneNumber substring telephoneNumber=+1*08*8585 0 INDEXED
telephoneNumber substring (telephoneNumber=+1*08*8585) 0 INDEXED
telephoneNumber substring (&(telephoneNumber=+1*08*8585)) 0 INDEXED
telephoneNumber substring (|(telephoneNumber=+1*08*8585)) 0 INDEXED
telephoneNumber substring (&(&(telephoneNumber=+1*08*8585))) 0 INDEXED
telephoneNumber substring (&(|(telephoneNumber=+1*08*8585))) 0 INDEXED
telephoneNumber substring (|(&(telephoneNumber=+1*08*8585))) 0 INDEXED
telephoneNumber substring (|(|(|(|(|(|(|(telephoneNumber=+1*08*8585)))))))) 0 INDEXED
telephoneNumber substring (&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(telephoneNumber=+1*08*8585)))))))))))))))) 0 INDEXED
telephoneNumber substring (&(|(&(|(&(|(&(|(&(|(&(|(&(|(&(|(telephoneNumber=+1*08*8585))))))))))))))))) 0 INDEXED
opends/tests/staf-tests/functional-tests/testcases/replication/conflict/conflict.xml
@@ -142,8 +142,8 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('uid=tuser-0')
                entry.addAttr('employeeNumber', '0')
                myEntry = Entry('uid=tuser-0')
                myEntry.addAttr('employeeNumber', '0')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
@@ -152,8 +152,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -173,7 +173,7 @@
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : server.getRootDn(),
                    'dsInstancePswd'    : server.getRootPwd(),
                    'DNToModify'        : entry.getDn(),
                    'DNToModify'        : myEntry.getDn(),
                    'attributeName'     : 'employeeNumber',
                    'newAttributeValue' : '%i' % (i + 1),
                    'changetype'        : 'replace'
@@ -191,7 +191,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
@@ -228,7 +228,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
  
@@ -265,9 +265,9 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=A1')
                entry.addAttr('description', '1')
                entry.addAttr('description', '2')
                myEntry = Entry('cn=A1')
                myEntry.addAttr('description', '1')
                myEntry.addAttr('description', '2')
                server1mods = ['description:3', 'description:4']
                server2mods = ['description:5', 'description:6']
                mods = [server1mods, server2mods]
@@ -279,8 +279,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -301,7 +301,7 @@
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'DNToModify'     : entry.getDn(),
                    'DNToModify'     : myEntry.getDn(),
                    'listAttributes' : mods[i],
                    'changetype'     : 'replace'
                  }
@@ -319,7 +319,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -357,7 +357,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -393,7 +393,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -428,8 +428,8 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=A4')
                entry.addAttr('employeeNumber', '0')
                myEntry = Entry('cn=A4')
                myEntry.addAttr('employeeNumber', '0')
              </script>
              <call function="'addAnEntry'">
                { 'location'       : server1Host,
@@ -438,8 +438,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -460,7 +460,7 @@
                    'dsInstancePort'    : server.getPort(),
                    'dsInstanceDn'      : server.getRootDn(),
                    'dsInstancePswd'    : server.getRootPwd(),
                    'DNToModify'        : entry.getDn(),
                    'DNToModify'        : myEntry.getDn(),
                    'attributeName'     : 'employeeNumber',
                    'newAttributeValue' : '%i' % (i + 1),
                    'changetype'        : 'replace'
@@ -479,7 +479,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
@@ -517,7 +517,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
@@ -553,7 +553,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -593,9 +593,9 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=A2')
                myEntry = Entry('cn=A2')
                for x in range(10):
                  entry.addAttr('description', '%i' % (x+1))
                  myEntry.addAttr('description', '%i' % (x+1))
                server1del = ['description:1']
                server1add = ['description:11']
                server2del = ['description:1']
@@ -611,8 +611,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -634,7 +634,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'delete'
                    }
@@ -647,7 +647,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][1],
                      'changetype'     : 'add'
                    }
@@ -666,7 +666,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -704,7 +704,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -740,7 +740,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -780,9 +780,9 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=A3')
                myEntry = Entry('cn=A3')
                for x in range(10):
                  entry.addAttr('description', '%i' % (x+1))
                  myEntry.addAttr('description', '%i' % (x+1))
                server1del = ['description:1']
                server1add = ['description:11']
                server2del = ['description:10']
@@ -798,8 +798,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -821,7 +821,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'delete'
                    }
@@ -834,7 +834,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][1],
                      'changetype'     : 'add'
                    }
@@ -853,7 +853,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -891,7 +891,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -927,7 +927,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -963,7 +963,7 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=B1')
                myEntry = Entry('cn=B1')
                server1add = ['description:1']
                server2add = ['description:1', 'description:2']
                server1mods = [server1add]
@@ -977,8 +977,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -1000,7 +1000,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'add'
                    }
@@ -1019,7 +1019,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -1057,7 +1057,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -1093,7 +1093,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -1129,7 +1129,7 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=B2')
                myEntry = Entry('cn=B2')
                server1add = ['employeeNumber:1']
                server2add = ['employeeNumber:2']
                server1mods = [server1add]
@@ -1143,8 +1143,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -1166,7 +1166,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'add'
                    }
@@ -1185,7 +1185,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
@@ -1223,7 +1223,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
@@ -1259,7 +1259,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -1296,9 +1296,9 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=C1')
                myEntry = Entry('cn=C1')
                for x in range(10):
                  entry.addAttr('description', '%i' % (x+1))
                  myEntry.addAttr('description', '%i' % (x+1))
                server1del = []
                for y in range(1,6):
                  server1del.append('description:%i' % y)
@@ -1316,8 +1316,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -1339,7 +1339,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'delete'
                    }
@@ -1358,7 +1358,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -1396,7 +1396,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -1432,7 +1432,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -1469,8 +1469,8 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=C2')
                entry.addAttr('employeeNumber', '1')
                myEntry = Entry('cn=C2')
                myEntry.addAttr('employeeNumber', '1')
                server1del = ['employeeNumber:']
                server2del = ['employeeNumber:1']
                server1mods = [server1del]
@@ -1484,8 +1484,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -1507,7 +1507,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : 'delete'
                    }
@@ -1526,7 +1526,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
@@ -1564,7 +1564,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'employeeNumber',
                      'logStderr'      : False
@@ -1600,7 +1600,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -1641,9 +1641,9 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=D1')
                entry.addAttr('description', '1')
                entry.addAttr('telephoneNumber', '1')
                myEntry = Entry('cn=D1')
                myEntry.addAttr('description', '1')
                myEntry.addAttr('telephoneNumber', '1')
                server1add = ['description:2']
                server1del = ['telephoneNumber:']
                server2del = ['description:']
@@ -1662,8 +1662,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -1685,7 +1685,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
@@ -1698,7 +1698,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][1],
                      'changetype'     : changetypes[i][1]
                    }
@@ -1717,7 +1717,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description telephoneNumber',
                      'logStderr'      : False
@@ -1755,7 +1755,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description telephoneNumber',
                      'logStderr'      : False
@@ -1791,7 +1791,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -1829,8 +1829,8 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=E1')
                entry.addAttr('description', '1')
                myEntry = Entry('cn=E1')
                myEntry.addAttr('description', '1')
                server1add = ['description:2', 'description:3']
                server2replace = ['description:4', 'description:5']
                server1mods = [server1add]
@@ -1847,8 +1847,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -1870,7 +1870,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
@@ -1889,7 +1889,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -1927,7 +1927,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -1963,7 +1963,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -2001,8 +2001,8 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=E2')
                entry.addAttr('description', '1')
                myEntry = Entry('cn=E2')
                myEntry.addAttr('description', '1')
                server1replace = ['description:2', 'description:3']
                server2add = ['description:4', 'description:5']
                server1mods = [server1replace]
@@ -2019,8 +2019,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -2042,7 +2042,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
@@ -2061,7 +2061,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -2099,7 +2099,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -2135,7 +2135,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -2174,9 +2174,9 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=F1')
                myEntry = Entry('cn=F1')
                for x in range(4):
                  entry.addAttr('description', '%i' % (x+1))
                  myEntry.addAttr('description', '%i' % (x+1))
                server1del = ['description:2', 'description:3']
                server2replace = []
                for y in range(6,11):
@@ -2195,8 +2195,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -2218,7 +2218,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
@@ -2237,7 +2237,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -2275,7 +2275,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -2311,7 +2311,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -2350,9 +2350,9 @@
                                                                
              <!-- Add entry to server1 -->
              <script>
                entry = Entry('cn=F2')
                myEntry = Entry('cn=F2')
                for x in range(4):
                  entry.addAttr('description', '%i' % (x+1))
                  myEntry.addAttr('description', '%i' % (x+1))
                server1replace = ['description:1', 'description:2', 
                                  'description:3']
                server2del = ['description:3', 'description:4']
@@ -2370,8 +2370,8 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'DNToAdd'        : entry.getDn(),
                  'listAttributes' : entry.getAttrList()
                  'DNToAdd'        : myEntry.getDn(),
                  'listAttributes' : myEntry.getAttrList()
                }
              </call>
@@ -2393,7 +2393,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'DNToModify'     : entry.getDn(),
                      'DNToModify'     : myEntry.getDn(),
                      'listAttributes' : mods[i][0],
                      'changetype'     : changetypes[i][0]
                    }
@@ -2412,7 +2412,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -2450,7 +2450,7 @@
                      'dsInstancePort' : server.getPort(),
                      'dsInstanceDn'   : server.getRootDn(),
                      'dsInstancePswd' : server.getRootPwd(),
                      'dsBaseDN'       : entry.getDn(),
                      'dsBaseDN'       : myEntry.getDn(),
                      'dsFilter'       : 'objectclass=*',
                      'dsAttributes'   : 'description',
                      'logStderr'      : False
@@ -2486,7 +2486,7 @@
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsDn'           : [entry.getDn()]
                  'dsDn'           : [myEntry.getDn()]
                }
              </call>
@@ -2981,8 +2981,11 @@
              <!-- Verify the synchronization of the trees among the servers in 
                the topology -->
              <!-- If the trees don't match, we may have come across Issue 4071
               (Replication conflict: delete parent, add child) -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, server1, [server2], synchroSuffix,
                  '4071' ]
              </call> 
              <!-- Delete added entries -->
@@ -3536,7 +3539,6 @@
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/replication/replication_cleanup.xml' 
                  % (TESTS_DIR)"/>
opends/tests/staf-tests/functional-tests/testcases/replication/replication_cleanup.xml
@@ -30,7 +30,16 @@
  <defaultcall function="replication_cleanup"/>
  <function name="replication_cleanup">
    <function-map-args>
      <function-arg-def name="suiteSuffix"
                        type="optional"
                        default="None">
        <function-arg-description>
          Test suite suffix used to copy the server logs back to the controller.
        </function-arg-description>
        <function-arg-property name="type" value="string"/>
      </function-arg-def>
    </function-map-args>
    <sequence>
      <block name="'replication-cleanup'">
@@ -41,8 +50,59 @@
          <call function="'stopServers'">
            [_topologyServerList]
          </call>
        <!-- Remove  the topology created for the test suite -->
          <!-- Copy the server logs to the controller machine -->
          <if expr="suiteSuffix != None">
            <paralleliterate var="server" in="_topologyServerList" indexvar="i">
              <sequence>
                <script>
                  suffix     = suiteSuffix + '_%s' % (i + 1)
                  serverHost = server.getHostname()
                  serverName = '%s:%s' % (serverHost, server.getPort())
                  serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                </script>
                <message>
                  'Copy %s/logs/errors from %s to %s/errors_%s on %s' % \
                  (serverPath, serverName, logs.sut, suffix, STAXServiceMachine)
                </message>
                <call function="'copyFile'">
                  {
                    'location'   : serverHost,
                    'srcfile'    : '%s/logs/errors' % serverPath,
                    'destfile'   : '%s/errors_%s' % (logs.sut, suffix),
                    'remotehost' : STAXServiceMachine
                  }
                </call>
                <message>
                  'Copy %s/logs/access from %s to %s/access_%s on %s' % \
                  (serverPath, serverName,logs.sut, suffix, STAXServiceMachine)
                </message>
                <call function="'copyFile'">
                  {
                    'location'   : serverHost,
                    'srcfile'    : '%s/logs/access' % serverPath,
                    'destfile'   : '%s/access_%s' % (logs.sut, suffix),
                    'remotehost' : STAXServiceMachine
                  }
                </call>
                <message>
                  'Copy %s/logs/replication from %s to %s/replication_%s on %s' % \
                  (serverPath, serverName, logs.sut, suffix, STAXServiceMachine)
                </message>
                <call function="'copyFile'">
                  {
                    'location'   : serverHost,
                    'srcfile'    : '%s/logs/replication' % serverPath,
                    'destfile'   : '%s/replication_%s' % (logs.sut, suffix),
                    'remotehost' : STAXServiceMachine
                  }
                </call>
              </sequence>
            </paralleliterate>
          </if>
          <!-- Remove  the topology created for the test suite -->
          <message>
            'Remove DS topology created for the Synchronization Basic Test Suite'
          </message>          
opends/tests/staf-tests/functional-tests/testcases/replication/resynchronization/resynchronization.xml
@@ -53,10 +53,34 @@
                  file="'%s/testcases/replication/replication_setup.xml' 
                        % (TESTS_DIR)"/>
          <call function="'replication_setup'">
            { 'dataFile' : 'Example.ldif' }
            { 'topologyFile' : '%s/3server_topology.txt' \
                               % REPLICATION_CONFIG_DIR,
              'dataFile'     : 'Example.ldif'
            }
          </call>
          
          <script>
            server3            = _topologyServerList[2]
            replicationServer3 = server3.getChangelogServer()
            # Remove 3rd server from replicated servers list until replication
            # is enabled on the 3rd one
            _topologyServerList.remove(server3)
            consumerList.remove(server3)
          </script>
          <!-- Remove 3rd server from replication topology (i.e. disable
               replication) -->
          <call function="'disableReplication'">
            { 'location'            : clientHost,
              'dsPath'              : clientPath,
              'dsInstanceHost'      : server3.getHostname(),
              'dsInstanceAdminPort' : server3.getAdminPort(),
              'replicationDnList'   : [synchroSuffix]
            }
          </call>
          
          <!--- Test Case information
          #@TestMarker          Replication Re-Synchronization Tests
          #@TestName            Replication: Re-Synchronization: Off-line
@@ -154,9 +178,9 @@
          #@TestSteps           Call dsreplication pre-external-initialization
          #@TestSteps           Import data on server A
          #@TestSteps           Back-up server A
          #@TestSteps           Call dsreplication post-external-initialization
          #@TestSteps           Add entry on server A
          #@TestSteps           Restore back-up on other servers
          #@TestSteps           Call dsreplication post-external-initialization
          #@TestPostamble
          #@TestResult          Success if trees synchronized
          -->
@@ -197,7 +221,7 @@
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'taskID'         : 'import task',
                  'taskID'         : 'import task - tc2',
                  'ldifFile'       : '%s/replication/Example.ldif' \
                                     % masterDataDir
                }
@@ -231,12 +255,28 @@
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'taskID'         : 'backup task',
                  'taskID'         : 'backup task - tc2',
                  'backupDir'      : '%s/replication/master_backup_online' \
                                     % masterDataDir
                }
              </call>
              
              <!-- Post-initialise the servers in the topology -->
              <message>
                '+++++ resynchronization on-line: end external server \
                initialization'
              </message>
              <call function="'postInitializeReplication'">
                { 'location'            : clientHost,
                  'dsPath'              : clientPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix],
                  'adminUID'            : adminUID,
                  'adminPswd'           : adminPswd
                }
              </call>
              <!-- Add entry to "master" server -->
              <message>
                '+++++ resynchronization on-line: add entry to %s:%s' \
@@ -279,29 +319,13 @@
                      'dsInstancePort' : consumer.getPort(),
                      'dsInstanceDn'   : consumer.getRootDn(),
                      'dsInstancePswd' : consumer.getRootPwd(),
                      'taskID'         : 'restore task',
                      'taskID'         : 'restore task - tc2',
                      'backupDir'   : '%s/%s/replication/master_backup_online' \
                                      % (consumer.getDir(),remote.reldatadir)
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Post-initialise the servers in the topology -->
              <message>
                '+++++ resynchronization on-line: end external server \
                initialization'
              </message>
              <call function="'postInitializeReplication'">
                { 'location'            : clientHost,
                  'dsPath'              : clientPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix],
                  'adminUID'            : adminUID,
                  'adminPswd'           : adminPswd
                }
              </call>
              </paralleliterate>
                                
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
@@ -312,7 +336,389 @@
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          
          <!--- Test Case information
          #@TestMarker          Replication Re-Synchronization Tests
          #@TestName            Replication: Re-Synchronization: Add new server
          #@TestID              Add new server
          #@TestPurpose         Initialise newly added replicated server
                                using on-line backup/restore
          #@TestPreamble
          #@TestSteps           Call dsreplication pre-external-initialization
          #@TestSteps           Import data on server A
          #@TestSteps           Back-up server A
          #@TestSteps           Initialise other servers from server A
          #@TestSteps           Add entry on server A
          #@TestSteps           Add server: enable replication
          #@TestSteps           Restore back-up on new server
          #@TestPostamble
          #@TestResult          Success if trees synchronized
          -->
          <testcase name="getTestCaseName('Add new Server')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'Replication: Re-Synchronization: Add new server. \
                Initialise newly added server using on-line backup/restore'
              </message>
              <paralleliterate var="server" in="_topologyServerList">
                <sequence>
                  <!-- Search for entry add -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : clientHost,
                      'dsPath'           : clientPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=*'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <message>
                    '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
                    (server.getHostname(), server.getPort(), searchResult)
                  </message>
                </sequence>
              </paralleliterate>
              <!-- Pre-initialise the servers in the topology -->
              <message>
                '+++++ resynchronization add server: prepare servers for \
                external initialization'
              </message>
              <call function="'preInitializeReplication'">
                { 'location'            : clientHost,
                  'dsPath'              : clientPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'localOnly'           : False,
                  'replicationDnList'   : [synchroSuffix],
                  'adminUID'            : adminUID,
                  'adminPswd'           : adminPswd
                }
              </call>
              <paralleliterate var="server" in="_topologyServerList">
                <sequence>
                  <!-- Search for entry add -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : clientHost,
                      'dsPath'           : clientPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=*'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <message>
                    '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
                    (server.getHostname(), server.getPort(), searchResult)
                  </message>
                </sequence>
              </paralleliterate>
              <!-- Import data into "master" server -->
              <message>
                '+++++ resynchronization add server: import data on %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'importLdifTask'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'taskID'         : 'import task - tc3',
                  'ldifFile'       : '%s/replication/Example.ldif' \
                                     % masterDataDir
                }
              </call>
              <!-- Check some data was imported into "master" server -->
              <call function="'checkImport'">
                { 'location'        : clientHost,
                  'dsPath'          : clientPath,
                  'dsHost'          : masterHost,
                  'dsPort'          : master.getPort(),
                  'dsAdminPort'     : master.getAdminPort(),
                  'dsDn'            : master.getRootDn(),
                  'dsPswd'          : master.getRootPwd(),
                  'expectedEntries' : ['uid=scarter,ou=People,o=example',
                                       'uid=dmiller, ou=People, o=example',
                                       'uid=rhunt, ou=People, o=example'],
                  'startDS'         :  'no'
                }
              </call>
              <!-- Backup "master" server -->
              <message>
                '+++++ resynchronization add server: back-up server %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'backupTask'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'taskID'         : 'backup task - tc3',
                  'backupDir'      : '%s/replication/master_backup_online' \
                                     % masterDataDir
                }
              </call>
              <paralleliterate var="server" in="_topologyServerList">
                <sequence>
                  <!-- Search for entry add -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : clientHost,
                      'dsPath'           : clientPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=*'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <message>
                    '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
                    (server.getHostname(), server.getPort(), searchResult)
                  </message>
                </sequence>
              </paralleliterate>
              <message>
                '+++++ resynchronization add server: Initialise topology from \
                %s:%s' % (masterHost, master.getPort())
              </message>
              <!-- Initialise the servers in the topology -->
              <call function="'initializeReplication'">
                { 'location'                : clientHost,
                  'dsPath'                  : clientPath,
                  'sourceInstanceHost'      : masterHost,
                  'sourceInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'       : [synchroSuffix]
                }
              </call>
              <paralleliterate var="server" in="_topologyServerList">
                <sequence>
                  <!-- Search for entry add -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : clientHost,
                      'dsPath'           : clientPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=*'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <message>
                    '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
                    (server.getHostname(), server.getPort(), searchResult)
                  </message>
                </sequence>
              </paralleliterate>
              <!-- Add entry to "master" server -->
              <message>
                '+++++ resynchronization add server: add entry to %s:%s' \
                % (masterHost, master.getPort())
              </message>
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' \
                                     % clientDataDir
                }
              </call>
              <paralleliterate var="server" in="_topologyServerList">
                <sequence>
                  <!-- Search for entry add -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : clientHost,
                      'dsPath'           : clientPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=*'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <message>
                    '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
                    (server.getHostname(), server.getPort(), searchResult)
                  </message>
                </sequence>
              </paralleliterate>
              <!-- Add new server to topology -->
              <message>
                '+++++ resynchronization add server: Enable replication for \
                server:\nHost: %s\nLdap port: %s\nReplication port: %s\n\
                Replicated DN list: %s' \
                % (server3.getHostname(), server3.getPort(),
                   replicationServer3.getPort(), [synchroSuffix])
              </message>
              <call function="'enableReplication'">
                { 'location'             : clientHost,
                  'dsPath'               : clientPath,
                  'dsInstanceHost'       : server3.getHostname(),
                  'dsInstanceAdminPort'  : server3.getAdminPort(),
                  'dsInstanceDn'         : server3.getRootDn(),
                  'dsInstancePswd'       : server3.getRootPwd(),
                  'dsReplicationPort'    : replicationServer3.getPort(),
                  'refInstanceHost'      : masterHost,
                  'refInstanceAdminPort' : master.getAdminPort(),
                  'refInstanceDn'        : master.getRootDn(),
                  'refInstancePswd'      : master.getRootPwd(),
                  'refReplicationPort'   : masterReplicationServer.getPort(),
                  'replicationDnList'    : [synchroSuffix]
                }
              </call>
              <script>
                # Add 3rd server to replicated servers list now that replication
                # has been enabled on the 3rd one
                _topologyServerList = _topologyServerList + [server3]
                consumerList = consumerList + [server3]
              </script>
              <paralleliterate var="server" in="_topologyServerList">
                <sequence>
                  <!-- Search for entry add -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : clientHost,
                      'dsPath'           : clientPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=*'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <message>
                    '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
                    (server.getHostname(), server.getPort(), searchResult)
                  </message>
                </sequence>
              </paralleliterate>
              <!-- Copy backup to new server and restore it -->
              <call function="'CopyFolderByExtension'">
                { 'location'   : masterHost,
                  'remotehost' : server3.getHostname(),
                  'srcfolder'  : '%s/replication/master_backup_online' \
                                 % masterDataDir,
                  'destfolder' : '%s/%s/replication/master_backup_online' \
                                 % (server3.getDir(),remote.reldatadir),
                  'extension'  : '*'
                }
              </call>
              <message>
                '+++++ resynchronization add server: restore back-up on %s:%s'\
                % (server3.getHostname(), server3.getPort())
              </message>
              <call function="'restoreTask'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server3.getHostname(),
                  'dsInstancePort' : server3.getPort(),
                  'dsInstanceDn'   : server3.getRootDn(),
                  'dsInstancePswd' : server3.getRootPwd(),
                  'taskID'         : 'restore task - tc3',
                  'backupDir'      : '%s/%s/replication/master_backup_online' \
                                     % (server3.getDir(),remote.reldatadir)
                }
              </call>
              <paralleliterate var="server" in="_topologyServerList">
                <sequence>
                  <!-- Search for entry add -->
                  <call function="'ldapSearchWithScript'">
                    { 'location'         : clientHost,
                      'dsPath'           : clientPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'dsBaseDN'         : 'dc=replicationChanges',
                      'dsFilter'         : 'uid=*'
                    }
                  </call>
                  <script>
                    searchRC = STAXResult[0][0]
                    searchResult = STAXResult[0][1]
                    resultLength = len(searchResult) > 0
                  </script>
                  <message>
                    '==> REPLICATION CHANGES %s:%s : \n%s\n' % \
                    (server.getHostname(), server.getPort(), searchResult)
                  </message>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <!-- If the trees don't match, we may have come across Issue 4052
               (Ghost adds in Replication Server) -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix,
                  '4052' ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/replication/replication_cleanup.xml' 
                        % (TESTS_DIR)"/>
opends/tests/staf-tests/functional-tests/testcases/tasks/backup_db.xml
@@ -510,9 +510,11 @@
              }
            </call>
       <!---
            <call function="'setKnownIssue'">
              { 'issueId' : '3773' }
            </call>
       -->
            <call function="'testCase_Postamble'"/>
          </sequence>
opends/tests/staf-tests/shared/ant/build.properties
@@ -62,7 +62,7 @@
eventmanager.archive=EventManagerV${eventmanager.version}.zip
http.version=301
http.archive=HTTPV${http.version}.zip
tomcat.version=6.0.14
tomcat.version=6.0.20
tomcat.url=http://archive.apache.org/dist/tomcat/tomcat-6/v${tomcat.version}/bin
tomcat.archive=apache-tomcat-${tomcat.version}.zip
opends/tests/staf-tests/shared/functions/dsadm.xml
@@ -556,7 +556,7 @@
        }
      </call>
      <call function="'Sleep'">
        { 'sleepForMilliSeconds'  : 3000 }
        { 'sleepForMilliSeconds'  : 10000 }
      </call>
    </sequence>
  </function>
opends/tests/staf-tests/shared/functions/environment.xml
@@ -169,7 +169,10 @@
        CurrentTestPath={}
        DSInfoServersDict={}
        True = 1
        False = 0
        False = 0
        # threshold set so that functions such as getFile may not cause staf
        # process to run out of memory (value in bytes)
        MAX_READABLE_SIZE = 104800
        # this function return a well-formatted testcase name
        def getTestCaseName(name):
opends/tests/staf-tests/shared/functions/stafcmd.xml
@@ -616,7 +616,11 @@
        <service>'fs'</service>
        <request>'GET ENTRY %s %s' % (entry,attribute)</request>
      </stafcmd>
      <script>
        cmdRC=RC
        cmdResult=STAFResult
      </script>
      <return>[cmdRC,cmdResult]</return>
    </sequence>
  </function>
opends/tests/staf-tests/shared/functions/tools.xml
@@ -418,22 +418,78 @@
        </envs>
        <console use="'same'"/>
        <stderr mode="'stdout'"/>
        <returnstdout/>
        <returnfile>outputLdif</returnfile>
        <returnstdout/>
      </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>
      <if expr="STAXCode == 0">
        <sequence>
          <!-- Check the size of the diff file, and avoid reading its
               content with getFile if the file is too big to prevent
               the staf process from running out of memory -->
          <call function="'GetEntry'">
            {
            'location'  : location,
            'entry'     : outputLdif,
            'attribute' : 'SIZE'
            }
          </call>
          <script>
            # GetEntry returns: STAXResult = [cmdRC, cmdResult]
            if RC == 0:
              diffsFileSize = int(STAXResult[1]['lowerSize'])
              msg = 'File: %s   Size (bytes): %s' % (outputLdif, diffsFileSize)
            else:
              diffsFileSize = MAX_READABLE_SIZE
              msg = 'Could not retrieve the size of file %s' % outputLdif
          </script>
          <message log="1"> 'LdifDiffWithScript: %s' % msg </message>
          <if expr="diffsFileSize &lt; MAX_READABLE_SIZE">
            <sequence>
              <call function="'getFile'">
                { 'location' : location,
                  'filename' : outputLdif
                }
              </call>
              <script>
                # getFile returns: STAXResult = [cmdRC, cmdResult]
                diffsFileContent = STAXResult[1]
                if diffsFileContent.startswith("# No differences were detected between the source and target LDIF files") :
                  diffRC = 0
                else:
                  diffRC = 1
              </script>
            </sequence>
            <else>
              <script>
                # diffs file to big to be read
                diffsFileContent = 'File too big to be read.'
                # if the diff file is too big, it means that there ARE
                # actually some diffs, so we may deduce diffRC = 1
                diffRC = 1
              </script>
            </else>
          </if>
        </sequence>
      </if>
      <if expr="diffRC == 0">
        <message log="1">
          'NO DIFFERENCES were detected between the source and the target \
          LDIF files.'
        </message>
        <else>
          <message log="1" level="'Error'">
            'Source and target LDIF files are DIFFERENT: \n\n%s' % \
            diffsFileContent
          </message>
        </else>
      </if>
      <return> diffRC </return>
    </sequence>
  </function>
@@ -620,19 +676,18 @@
        'Verify tree %s taking %s as reference.' \
        % (treeSuffix, referenceServerPath)
      </message>
      <!-- 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
      <!-- Retrieve the tree from the reference server -->
      <call function="'exportLdif'">
        { 'location'            : location,
          'dsPath'              : dsPath,
          'dsInstanceHost'      : referenceServer.getHostname(),
          'dsInstanceAdminPort' : referenceServer.getAdminPort(),
          'dsInstanceDn'        : referenceServer.getRootDn(),
          'dsInstancePswd'      : referenceServer.getRootPwd(),
          'ldifFile'            : '%s/../%s' % (dsPath, referenceTree)
        }
      </call>
      <if expr="RC != 0">
        <!-- If the reference tree could not be retrieved, return an error -->
        <return> [1, None] </return>
@@ -640,21 +695,43 @@
      <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,
              'logStderr'      : False
          <if expr="server.getHostname() == location">
            <script>
              filePath = dsPath
              isSameLocation = True
            </script>
            <else>
              <script>
                filePath = '%s/%s' % (server.getDir(), OPENDSNAME)
                isSameLocation = False
              </script>
            </else>
          </if>
          <call function="'exportLdif'">
            { 'location'            : location,
              'dsPath'              : dsPath,
              'dsInstanceHost'      : server.getHostname(),
              'dsInstanceAdminPort' : server.getAdminPort(),
              'dsInstanceDn'        : server.getRootDn(),
              'dsInstancePswd'      : server.getRootPwd(),
              'ldifFile'            : '%s/../%s' % (filePath, sampleTree)
            }
          </call>
          <if expr="RC == 0">
            <sequence>
              <if expr="not isSameLocation">
                <!-- Copy sample tree file to reference server -->
                <call function="'copyFile'">
                  { 'location'   : server.getHostname(),
                    'remotehost' : location,
                    'srcfile'    : '%s/../%s' % (filePath, sampleTree),
                    'destfile'   : '%s/../%s' % (dsPath, sampleTree)
                  }
                </call>
              </if>
              <!-- Compare this tree to the reference one -->
              <call function="'LdifDiffWithScript'">
                { 'location'   : location,
@@ -664,11 +741,19 @@
                  'outputLdif' : '%s/../%s' % (dsPath, treeDiffs)
                }
              </call>
              <script>
                if STAXResult != 0 :
                  failedServers.append('%s:%s' % \
                                       (server.getHostname(), server.getPort()))
              </script>
              <if expr="STAXResult != 0">
                <sequence>
                  <script>
                    failedServers.append('%s:%s' % \
                                         (server.getHostname(), server.getPort()))
                  </script>
                  <message log="1" level="'Error'">
                    'Tree is DIFFERENT for %s:%s compared to %s:%s' % \
                    (server.getHostname(), server.getPort(),
                     referenceServer.getHostname(), referenceServer.getPort())
                  </message>
                </sequence>
              </if>
            </sequence>
            <else>
              <script>
@@ -1795,6 +1880,171 @@
      </return>
    </sequence>
  </function>
  
  <function name="verifyReplication">
    <function-prolog>
      This function verifies that replication is working, that is, the updates
      done on any of the servers in the topology are being pushed to the other
      servers.
    </function-prolog>
    <function-list-args>
      <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="replicatedSuffix" 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-arg-def name="knownIssue" type="optional" default="None">
        <function-arg-description>
          Known issue. Corresponds to an issue number.
        </function-arg-description>
        <function-arg-property name="type" value="string" />
      </function-arg-def>
    </function-list-args>
    <sequence>
      <message>
        'verifyReplication: Verify updates on the suffix %s are being \
        replicated.' % replicatedSuffix
      </message>
      <iterate var="server" in="serverList" indexvar="i">
        <sequence>
          <script>
            serverHost = server.getHostname()
            serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
            otherServersList = serverList[:i] + serverList[i+1:]
            entryDn = 'uid=testentry-%s, %s' % (i, replicatedSuffix)
            myRC = 0
            myKnownIssue = knownIssue
            failedServers = STAXGlobal( [] )
            failingServerList = ''
          </script>
          <!-- Add entry to one of the other servers -->
          <script>
            listAttr = []
            listAttr.append('objectclass:top')
            listAttr.append('objectclass:organizationalperson')
            listAttr.append('objectclass:inetorgperson')
            listAttr.append('objectclass:person')
            listAttr.append('givenname:Test-%s' % i)
            listAttr.append('sn:Entry-%s' % i)
            listAttr.append('cn:Test Entry - %s' % i)
          </script>
          <message>
            'verifyReplication: Add entry %s to server %s:%s' % \
            (entryDn, serverHost, server.getPort())
          </message>
          <call function="'addAnEntry'">
            { 'location'       : serverHost,
              'dsPath'         : serverPath,
              'dsInstanceHost' : serverHost,
              'dsInstancePort' : server.getPort(),
              'dsInstanceDn'   : server.getRootDn(),
              'dsInstancePswd' : server.getRootPwd(),
              'DNToAdd'        : entryDn,
              'listAttributes' : listAttr
            }
          </call>
          <call function="'Sleep'">
            { 'sleepForMilliSeconds'  : 2000 }
          </call>
          <!-- Check the update has been propagated -->
          <paralleliterate var="otherServer" in="otherServersList">
            <sequence>
              <call function="'ldapSearchWithScript'">
                { 'location'       : otherServer.getHostname(),
                  'dsPath'         : '%s/%s' \
                                     % (otherServer.getDir(), OPENDSNAME),
                  'dsInstanceHost' : otherServer.getHostname(),
                  'dsInstancePort' : otherServer.getPort(),
                  'dsInstanceDn'   : otherServer.getRootDn(),
                  'dsInstancePswd' : otherServer.getRootPwd(),
                  'dsBaseDN'       : entryDn,
                  'dsFilter'       : 'objectclass=*',
                  'dsAttributes'   : 'employeeNumber',
                  'logStderr'      : False
                }
              </call>
              <script>
                searchRC = STAXResult[0][0]
                searchResult = STAXResult[0][1]
                resultLength = len(searchResult) > 0
              </script>
              <if expr="resultLength != 0">
                <sequence>
                  <message>
                    '+++++++++++ LDAPSEARCH RESULT for %s:%s ++++++++\n%s' \
                    % (otherServer.getHostname(), otherServer.getPort(),
                       searchResult)
                  </message>
                </sequence>
              <else>
                <sequence>
                  <message>
                    'verifyReplication: Entry %s NOT found in server %s:%s' % \
                    (entryDn, otherServer.getHostname(), otherServer.getPort())
                  </message>
                  <script>
                    failedServers.append('%s:%s' % \
                             (otherServer.getHostname(), otherServer.getPort()))
                  </script>
                </sequence>
              </else>
              </if>
            </sequence>
          </paralleliterate>
          <if expr="len(failedServers) > 0">
            <!-- If at least one server failed to receive the update 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 (replication verify FAILED \
                for entry %s): %s ' % (entryDn, comma.join(failedServers))
            </script>
            <else>
              <message>
                'All servers synchronized (replication verify SUCCEEDED for \
                entry %s)' % entryDn
              </message>
            </else>
          </if>
          <call function="'checktestRC'">
            { 'returncode' : myRC,
              'result'     : failingServerList,
              'expected'   : 0,
              'issue'      : myKnownIssue
            }
          </call>
        </sequence>
      </iterate>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/shared/functions/topology.xml
@@ -2545,5 +2545,220 @@
     </sequence>
  </function>
  <!-- Get replication status using dsreplication, and check for missing changes
       or inconsistencies in the number of entries across the topology -->
  <function name="getReplicationStatus">
    <function-prolog>
      This function gets the replication status of a topology using
      dsreplication.
    </function-prolog>
    <function-map-args>
      <function-arg-def name="location"
                        type="optional"
                        default="STAF_REMOTE_HOSTNAME">
        <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_BIN,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="dsInstanceHost"
                        type="optional"
                        default="None">
        <function-arg-description>
          Directory server hostname or IP address
        </function-arg-description>
        <function-arg-property name="type" value="hostname" />
      </function-arg-def>
      <function-arg-def name="dsInstanceAdminPort"
                        type="optional"
                        default="None">
        <function-arg-description>
          Directory server admin port number
        </function-arg-description>
        <function-arg-property name="type" value="Port number" />
      </function-arg-def>
      <function-arg-def name="replicationDnList" type="required">
        <function-arg-description>
          DN of the replicated suffix
        </function-arg-description>
        <function-arg-property name="type" value="DN list" />
      </function-arg-def>
      <function-arg-def name="adminUID"
                                   type="optional"
                                   default="AdminUID">
        <function-arg-description>
          Global Administrator UID
        </function-arg-description>
        <function-arg-property name="type" value="UID" />
      </function-arg-def>
      <function-arg-def name="adminPswd"
                                   type="optional"
                                   default="AdminPswd">
        <function-arg-description>
          Global Administrator password
        </function-arg-description>
        <function-arg-property name="type" value="string" />
      </function-arg-def>
      <function-arg-def name="expectedRC" type="optional" default="0">
        <function-arg-description>
        Expected return code value. Default value is 0
        </function-arg-description>
        <function-arg-property name="type" value="string" />
      </function-arg-def>
    </function-map-args>
    <sequence>
      <message>
        'Getting replication status from server %s:%s' \
         % (dsInstanceHost,dsInstanceAdminPort)
      </message>
      <!-- Local variables -->
      <script>
        STAFCmdParams=''
        STAFCmd=''
        if dsPath:
          dsBinPath='%s/%s' % (dsPath,fileFolder)
          STAFCmd='%s/%s%s' % (dsBinPath,DSREPLICATION,fileExt)
        STAFCmdParamsList=[]
        STAFCmdParamsList.append('status')
        STAFCmdParamsList.append('-n')
        STAFCmdParamsList.append('-X')
        # option for getting status in script-friendly format
        STAFCmdParamsList.append('-s')
        if dsInstanceHost:
          STAFCmdParamsList.append('-h %s' % dsInstanceHost)
        if dsInstanceAdminPort:
          STAFCmdParamsList.append('-p %s' % dsInstanceAdminPort)
        if replicationDnList:
          for dn in replicationDnList:
            STAFCmdParamsList.append('-b "%s"' % dn)
        if adminUID:
          STAFCmdParamsList.append('-I "%s"' % adminUID)
        if adminPswd:
          STAFCmdParamsList.append('-w "%s"' % adminPswd)
        STAFCmdParams=' '.join(STAFCmdParamsList)
      </script>
      <call function="'runCommand'">
        { 'name'      : 'Get Replication Status',
          'location'  : location,
          'command'   : STAFCmd,
          'arguments' : STAFCmdParams
        }
      </call>
      <script>
        commandRC = RC
        commandResult = STAXResult
      </script>
      <call function="'checktestRC'">
        { 'returncode' : commandRC,
          'result'     : commandResult,
          'expected'   : expectedRC
        }
      </call>
      <script>
        replStatusRC = commandResult[0][0]
        replStatusResult = commandResult[0][1]
        resultLength = len(replStatusResult) > 0
      </script>
      <if expr="(replStatusRC == 0) and (resultLength != 0)">
        <sequence>
          <message>
            'getReplicationStatus: Replication status retrieved from server \
            %s:%s : \n%s ' % \
            (dsInstanceHost, dsInstanceAdminPort, replStatusResult)
          </message>
          <script>
            serverList = []
            entriesList = []
            missingChangesList = []
            ageList = []
            for line in replStatusResult.splitlines():
              if line.startswith('Server:'):
                server = line[line.find('Server:') + 7:].strip()
                serverList.append(server)
              elif line.startswith('Entries:'):
                entries = line[line.find('Entries:') + 8:].strip()
                entriesList.append(entries)
              elif line.startswith('Missing Changes:'):
                missingChanges = line[line.find('Missing') + 16:].strip()
                missingChangesList.append(missingChanges)
              elif line.startswith('Age of oldest missing change:'):
                age = line[line.find('Age of') + 29:].strip()
                ageList.append(age)
            refNbOfEntries = entriesList[0]
          </script>
          <iterate var="server" in="serverList" indexvar="i">
            <sequence>
              <script>
                entries = entriesList[i]
                missingChanges = missingChangesList[i]
                age = ageList[i]
              </script>
              <if expr="(missingChanges != '0') or (age != 'N/A')">
                <sequence>
                  <message log="1" level="'Error'">
                    'getReplicationStatus: Server %s is missing %s changes. \
                    Entries: %s - Age of the oldest missing change: %s ' % \
                    (server, missingChanges, entries, age)
                  </message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>
              <if expr="entries != refNbOfEntries">
                <sequence>
                  <message log="1" level="'Error'">
                    'getReplicationStatus: Different number of entries.\n\
                      Server %s : %s entries\n\
                      Reference server %s : %s entries\n' % \
                    (server, entries, serverList[0], refNbOfEntries)
                  </message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>
            </sequence>
          </iterate>
        </sequence>
      </if>
      <return>
        commandResult
      </return>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/shared/functions/utils.xml
@@ -284,7 +284,7 @@
      <if expr='re.search(searchre, returnString) != None'>
        <sequence>
          <message log="1">
            'SUCCESS :  Found substring, %s, in the return string' \
            'Found substring, %s, in the return string' \
            % (expectedString)
          </message>
          <script>
@@ -294,8 +294,8 @@
        </sequence>
        <else>
          <sequence>
            <message log="1" level="'Error'">
              'ERROR : Did not find substring, %s, in the return string, %s' \
            <message log="1">
              'Did not find substring, %s, in the return string, %s' \
              % (expectedString, returnString)
            </message>
            <script>
@@ -309,16 +309,26 @@
      <!-- Manage expectedRC and knownIssue -->
      <if expr="expectedRC != 'noCheck'">
          <if expr="myRC == expectedRC">
            <tcstatus result="'pass'"/>
            <sequence>
              <message log="1">
                'SUCCESS: searchString successful'
              </message>
              <tcstatus result="'pass'"/>
            </sequence>
            <else>
              <if expr="knownIssue == None">
                <tcstatus result="'fail'"/>
                <else>
                  <call function="'setKnownIssue'">
                    { 'issueId' : knownIssue }
                  </call>
                </else>
              </if>
              <sequence>
                <message log="1" level="'Error'">
                  'ERROR: searchString fail'
                </message>
                <if expr="knownIssue == None">
                  <tcstatus result="'fail'"/>
                  <else>
                    <call function="'setKnownIssue'">
                      { 'issueId' : knownIssue }
                    </call>
                  </else>
                </if>
              </sequence>
            </else>
          </if>
      </if>
opends/tests/staf-tests/shared/topology/3server_topology.txt
@@ -32,9 +32,9 @@
RootDn: cn=directory manager
RootPwd: secret12
BaseDn: o=example
Changelogport: 11111
Changelogport: 11112
SynchronizedSuffix: o=example
ChangelogServer: ${remote.hostname}:11111
ChangelogServer: ${remote.hostname}:11112
ChangelogServer: ${remote.hostname}:22222
ChangelogServer: ${remote.hostname}:33333
@@ -49,7 +49,7 @@
BaseDn: o=example
Changelogport: 22222
SynchronizedSuffix: o=example
ChangelogServer: ${remote.hostname}:11111
ChangelogServer: ${remote.hostname}:11112
ChangelogServer: ${remote.hostname}:22222
ChangelogServer: ${remote.hostname}:33333
@@ -64,6 +64,6 @@
BaseDn: o=example
Changelogport: 33333
SynchronizedSuffix: o=example
ChangelogServer: ${remote.hostname}:11111
ChangelogServer: ${remote.hostname}:11112
ChangelogServer: ${remote.hostname}:22222
ChangelogServer: ${remote.hostname}:33333
opends/tests/staf-tests/shared/topology/basic_topology.txt
@@ -32,9 +32,9 @@
RootDn: cn=directory manager
RootPwd: secret12
BaseDn: o=example
Changelogport: 11111
Changelogport: 11112
SynchronizedSuffix: o=example
ChangelogServer: ${remote.hostname}:11111
ChangelogServer: ${remote.hostname}:11112
ChangelogServer: ${remote.hostname}:22222
Hostname: ${remote.hostname}
@@ -48,5 +48,5 @@
BaseDn: o=example
Changelogport: 22222
SynchronizedSuffix: o=example
ChangelogServer: ${remote.hostname}:11111
ChangelogServer: ${remote.hostname}:11112
ChangelogServer: ${remote.hostname}:22222
opends/tests/staf-tests/shared/xsl/gen-suites-report.xsl
@@ -58,7 +58,6 @@
  <xsl:param name="tests-type"/>
  <!--- Test Suites Report Header Variables -->
  <xsl:variable name="ft"             select="qa/$tests-type"/>
  <xsl:variable name="id"             select="identification"/>
  <xsl:variable name="sut"            select="$id/sut"/>
  <xsl:variable name="mailto"         select="normalize-space($id/mailto)"/>
opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif.xml
@@ -58,7 +58,7 @@
            testList = []
            testList.append('import_ldif_bin_attr')
            testList.append('import_ldif_bin_attr_1m')
            testList.append('import_ldif_bin_attr_5m')
            #testList.append('import_ldif_bin_attr_3m')
            #testList.append('import_ldif_large_import_buffer')
            #testList.append('import_ldif_many_thrds')
            #testList.append('import_ldif_low_index_entry_limit')
opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif_bin_attr.xml
@@ -187,7 +187,7 @@
                  'noOfMilliSeconds' : 5000
                  }
                </call> 
                <call function="'testCase_Postamble'"/>
    
              </sequence>
@@ -203,17 +203,17 @@
                <call function="'checkImport'">
                  {
                  'expectedEntries' : ['uid=user.100000,ou=People,dc=com' ,
                                      'uid=user.110000,ou=People,dc=com' ,
                                      'uid=user.120000,ou=People,dc=com' ,
                                      'uid=user.130000,ou=People,dc=com' ,
                                      'uid=user.140000,ou=People,dc=com' ,
                                      'uid=user.150000,ou=People,dc=com' ,
                                      'uid=user.160000,ou=People,dc=com' ,
                                      'uid=user.170000,ou=People,dc=com' ,
                                      'uid=user.180000,ou=People,dc=com' ,
                                      'uid=user.190000,ou=People,dc=com' ,
                                      'uid=user.199999,ou=People,dc=com'] ,
                  'expectedEntries' : ['uid=user.1,ou=People,dc=com' ,
                                      'uid=user.10000,ou=People,dc=com' ,
                                      'uid=user.20000,ou=People,dc=com' ,
                                      'uid=user.30000,ou=People,dc=com' ,
                                      'uid=user.40000,ou=People,dc=com' ,
                                      'uid=user.50000,ou=People,dc=com' ,
                                      'uid=user.60000,ou=People,dc=com' ,
                                      'uid=user.70000,ou=People,dc=com' ,
                                      'uid=user.80000,ou=People,dc=com' ,
                                      'uid=user.90000,ou=People,dc=com' ,
                                      'uid=user.99999,ou=People,dc=com'] ,
                  'startDS'         : 'no'
                  }
                </call>
@@ -221,45 +221,36 @@
                <!--<call function="'setKnownIssue'">
                    { 'issueId' : '2535' }
                </call>-->
                <message>
                  'ldclt_compare: Delete ldif and template files'
                </message>
                <call function="'deleteFile'">
                  {
                  'location' : STAF_REMOTE_HOSTNAME,
                  'filename' : ldifFile
                  }
                </call>
                <call function="'deleteFile'">
                  {
                  'location' : STAF_REMOTE_HOSTNAME,
                  'filename' : ldifTemplate
                  }
                </call>
                <call function="'testCase_Postamble'"/>
    
              </sequence>
          </testcase>
          <testcase name="getTestCaseName('Postamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'ldclt_compare: Delete ldif and template files'
              </message>
              <call function="'deleteFile'">
                {
                'location' : STAF_REMOTE_HOSTNAME,
                'filename' : ldifFile
                }
              </call>
              <call function="'deleteFile'">
                {
                'location' : STAF_REMOTE_HOSTNAME,
                'filename' : ldifTemplate
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/import_ldif/import_ldif_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'import_ldif_cleanup'" />
          <call function="'import_ldif_cleanup'">
            { 'suiteSuffix' : 'import' }
          </call>
              
          <call function="'testSuite_Postamble'"/>
            
opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif_bin_attr_1m.xml
@@ -219,7 +219,7 @@
                  'noOfMilliSeconds' : 5000
                  }
                </call>      
                <call function="'testCase_Postamble'"/>
    
              </sequence>
@@ -253,46 +253,37 @@
                <!--<call function="'setKnownIssue'">
                    { 'issueId' : '2535' }
                </call>-->
                <message>
                  'ldclt_compare: Delete ldif and template files'
                </message>
                <call function="'deleteFile'">
                  {
                  'location' : STAF_REMOTE_HOSTNAME,
                  'filename' : ldifFile
                  }
                </call>
                <call function="'deleteFile'">
                  {
                  'location' : STAF_REMOTE_HOSTNAME,
                  'filename' : ldifTemplate
                  }
                </call>
                <call function="'testCase_Postamble'"/>
    
              </sequence>
          </testcase>
          <testcase name="getTestCaseName('Postamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'ldclt_compare: Delete ldif and template files'
              </message>
              <call function="'deleteFile'">
                {
                'location' : STAF_REMOTE_HOSTNAME,
                'filename' : ldifFile
                }
              </call>
              <call function="'deleteFile'">
                {
                'location' : STAF_REMOTE_HOSTNAME,
                'filename' : ldifTemplate
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/import_ldif/import_ldif_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'import_ldif_cleanup'" />
          <call function="'import_ldif_cleanup'">
            { 'suiteSuffix' : 'import_1m' }
          </call>
          <call function="'testSuite_Postamble'"/>
            
        </sequence>
opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif_bin_attr_3m.xml
@@ -27,13 +27,13 @@
 ! -->
<stax>
  <defaultcall function="import_ldif_bin_attr_5m"/>
  <defaultcall function="import_ldif_bin_attr_3m"/>
  <function name="import_ldif_bin_attr_5m">
  <function name="import_ldif_bin_attr_3m">
    <sequence>
      <block name="'bin-attr_5m'">
      <block name="'bin-attr_3m'">
      
        <sequence>
  
@@ -219,7 +219,7 @@
                  'noOfMilliSeconds' : 5000
                  }
                </call> 
                <call function="'testCase_Postamble'"/>
    
              </sequence>
@@ -253,46 +253,37 @@
                <!--<call function="'setKnownIssue'">
                    { 'issueId' : '2535' }
                </call>-->
                <message>
                  'ldclt_compare: Delete ldif and template files'
                </message>
                <call function="'deleteFile'">
                  {
                  'location' : STAF_REMOTE_HOSTNAME,
                  'filename' : ldifFile
                  }
                </call>
                <call function="'deleteFile'">
                  {
                  'location' : STAF_REMOTE_HOSTNAME,
                  'filename' : ldifTemplate
                  }
                </call>
                <call function="'testCase_Postamble'"/>
    
              </sequence>
          </testcase>
          <testcase name="getTestCaseName('Postamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'ldclt_compare: Delete ldif and template files'
              </message>
              <call function="'deleteFile'">
                {
                'location' : STAF_REMOTE_HOSTNAME,
                'filename' : ldifFile
                }
              </call>
              <call function="'deleteFile'">
                {
                'location' : STAF_REMOTE_HOSTNAME,
                'filename' : ldifTemplate
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/import_ldif/import_ldif_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'import_ldif_cleanup'" />
          <call function="'import_ldif_cleanup'">
            { 'suiteSuffix' : 'import_3m' }
          </call>
          <call function="'testSuite_Postamble'"/>
            
        </sequence>
opends/tests/staf-tests/stress-tests/testcases/import_ldif/import_ldif_cleanup.xml
@@ -30,6 +30,14 @@
  <defaultcall function="import_ldif_cleanup"/>
  <function name="import_ldif_cleanup">
    <function-map-args>
      <function-arg-def name="suiteSuffix" type="required">
        <function-arg-description>
          Suite suffix
        </function-arg-description>
        <function-arg-property name="type" value="boolean"/>
      </function-arg-def>
    </function-map-args>
    <sequence>
@@ -57,7 +65,41 @@
            </sequence>
          </block>
          <!--- Save access and errors logs -->
          <block name="'Save Logs'">
            <sequence>
              <message>
                'Copy %s/%s/logs/errors from %s to %s/errors_%s on %s' \
                % (DIRECTORY_INSTANCE_DIR,OPENDSNAME,STAF_REMOTE_HOSTNAME,logs.sut,suiteSuffix,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_REMOTE_HOSTNAME ,
                'srcfile'    : '%s/%s/logs/errors' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME) ,
                'destfile'   : '%s/errors_%s' % (logs.sut,suiteSuffix) ,
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/%s/logs/access from %s to %s/access_%s on %s' \
                % (DIRECTORY_INSTANCE_DIR,OPENDSNAME,STAF_REMOTE_HOSTNAME,logs.sut,suiteSuffix,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_REMOTE_HOSTNAME ,
                'srcfile'    : '%s/%s/logs/access' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME) ,
                'destfile'   : '%s/access_%s' % (logs.sut,suiteSuffix) ,
                'remotehost' : STAXServiceMachine
                }
              </call>
            </sequence>
          </block>
          <!-- Remove  the topology created for the test suite -->
          <block name="'Block Remove DS Topology'">
opends/tests/staf-tests/stress-tests/testcases/ldap_operation/ldap_operation_cleanup.xml
@@ -30,7 +30,15 @@
  <defaultcall function="ldap_operation_cleanup"/>
  <function name="ldap_operation_cleanup">
    <function-map-args>
      <function-arg-def name="suiteSuffix" type="required">
        <function-arg-description>
          Suite suffix
        </function-arg-description>
        <function-arg-property name="type" value="boolean"/>
      </function-arg-def>
    </function-map-args>
    <sequence>
      <block name="'cleanup'">
@@ -57,7 +65,41 @@
            </sequence>
          </block>
          <!--- Save access and errors logs -->
          <block name="'Save Logs'">
            <sequence>
              <message>
                'Copy %s/%s/logs/errors from %s to %s/errors_%s on %s' \
                % (DIRECTORY_INSTANCE_DIR,OPENDSNAME,STAF_REMOTE_HOSTNAME,logs.sut,suiteSuffix,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_REMOTE_HOSTNAME ,
                'srcfile'    : '%s/%s/logs/errors' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME) ,
                'destfile'   : '%s/errors_%s' % (logs.sut,suiteSuffix) ,
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/%s/logs/access from %s to %s/access_%s on %s' \
                % (DIRECTORY_INSTANCE_DIR,OPENDSNAME,STAF_REMOTE_HOSTNAME,logs.sut,suiteSuffix,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_REMOTE_HOSTNAME ,
                'srcfile'    : '%s/%s/logs/access' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME) ,
                'destfile'   : '%s/access_%s' % (logs.sut,suiteSuffix) ,
                'remotehost' : STAXServiceMachine
                }
              </call>
            </sequence>
          </block>
          <!-- Remove  the topology created for the test suite -->
          <block name="'Block Remove DS Topology'">
opends/tests/staf-tests/stress-tests/testcases/ldap_operation/ldclt_add_delete.xml
@@ -49,7 +49,7 @@
            adddeleteLoop   = testsDuration / 10
            lowRange        = 100000
            highRange       = lowRange + numberOfEntries
            jvmLoop         = testsDuration / 1800
            jvmLoop         = testsDuration / 1800 + 1
            jvmSleep        = 1800000
            baseDN          = 'ou=People,dc=com'
            ldcltDir        = '%s/ldclt_dir' % TMPDIR
@@ -210,9 +210,11 @@
                            }
                          </call>
                          <call function="'Sleep'">
                            { 'sleepForMilliSeconds'  : jvmSleep }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
@@ -230,6 +232,32 @@
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_add.res from %s to %s on %s' \
                % (ldcltDir,STAF_CLIENT_HOSTNAME,logs.sut,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'srcfile'    : '%s/ldclt_add.res' % ldcltDir ,
                'destfile'   : '%s/ldclt_add.res' % logs.sut ,
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_delete.res from %s to %s on %s' \
                % (ldcltDir,STAF_CLIENT_HOSTNAME,logs.sut,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'srcfile'    : '%s/ldclt_delete.res' % ldcltDir ,
                'destfile'   : '%s/ldclt_delete.res' % logs.sut ,
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
@@ -264,7 +292,9 @@
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/ldap_operation/ldap_operation_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'ldap_operation_cleanup'" />
          <call function="'ldap_operation_cleanup'">
            { 'suiteSuffix' : 'add_delete' }
          </call>
          <call function="'testSuite_Postamble'"/>
            
opends/tests/staf-tests/stress-tests/testcases/ldap_operation/ldclt_compare.xml
@@ -49,7 +49,7 @@
            compareLoop      = testsDuration / 10
            lowRange        = 100000
            highRange       = lowRange + numberOfEntries
            jvmLoop         = testsDuration / 1800
            jvmLoop         = testsDuration / 1800 + 1
            jvmSleep        = 1800000
            baseDN          = 'ou=People,dc=com'
            ldcltDir        = '%s/ldclt_dir' % TMPDIR
@@ -236,9 +236,11 @@
                            }
                          </call>
                          <call function="'Sleep'">
                            { 'sleepForMilliSeconds'  : jvmSleep }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
@@ -255,7 +257,20 @@
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_compare.res from %s to %s on %s' \
                % (ldcltDir,STAF_CLIENT_HOSTNAME,logs.sut,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'srcfile'    : '%s/ldclt_compare.res' % ldcltDir ,
                'destfile'   : '%s/ldclt_compare.res' % logs.sut ,
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
@@ -282,19 +297,6 @@
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Postamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'ldclt_compare: Delete ldif and template files'
              </message>
@@ -318,10 +320,12 @@
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/ldap_operation/ldap_operation_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'ldap_operation_cleanup'" />
          <call function="'ldap_operation_cleanup'">
            { 'suiteSuffix' : 'compare' }
          </call>
          <call function="'testSuite_Postamble'"/>
            
opends/tests/staf-tests/stress-tests/testcases/ldap_operation/ldclt_modify.xml
@@ -49,7 +49,7 @@
            modifyLoop      = testsDuration / 10
            lowRange        = 100000
            highRange       = lowRange + numberOfEntries
            jvmLoop         = testsDuration / 1800
            jvmLoop         = testsDuration / 1800 + 1
            jvmSleep        = 1800000
            baseDN          = 'ou=People,dc=com'
            ldcltDir        = '%s/ldclt_dir' % TMPDIR
@@ -236,9 +236,11 @@
                            }
                          </call>
                          <call function="'Sleep'">
                            { 'sleepForMilliSeconds'  : jvmSleep }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
@@ -255,7 +257,20 @@
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_modify.res from %s to %s on %s' \
                % (ldcltDir,STAF_CLIENT_HOSTNAME,logs.sut,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'srcfile'    : '%s/ldclt_modify.res' % ldcltDir ,
                'destfile'   : '%s/ldclt_modify.res' % logs.sut ,
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
@@ -290,7 +305,9 @@
          
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/ldap_operation/ldap_operation_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'ldap_operation_cleanup'" />
          <call function="'ldap_operation_cleanup'">
            { 'suiteSuffix' : 'modify' }
          </call>
          <call function="'testSuite_Postamble'"/>
            
opends/tests/staf-tests/stress-tests/testcases/ldap_operation/ldclt_modifyrdn.xml
@@ -49,7 +49,7 @@
            modifyrdnLoop   = testsDuration / 10
            lowRange        = 100000
            highRange       = lowRange + 2 * numberOfEntries
            jvmLoop         = testsDuration / 1800
            jvmLoop         = testsDuration / 1800 + 1
            jvmSleep        = 1800000
            baseDN          = 'ou=People,dc=com'
            ldcltDir        = '%s/ldclt_dir' % TMPDIR
@@ -235,9 +235,11 @@
                            }
                          </call>
                          <call function="'Sleep'">
                            { 'sleepForMilliSeconds'  : jvmSleep }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
@@ -255,6 +257,19 @@
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_modifyrdn.res from %s to %s on %s' \
                % (ldcltDir,STAF_CLIENT_HOSTNAME,logs.sut,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'srcfile'    : '%s/ldclt_modifyrdn.res' % ldcltDir ,
                'destfile'   : '%s/ldclt_modifyrdn.res' % logs.sut ,
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
@@ -289,7 +304,9 @@
          
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/import_ldif/import_ldif_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'import_ldif_cleanup'" />
          <call function="'ldap_operation_cleanup'">
            { 'suiteSuffix' : 'modifyrdn' }
          </call>
          <call function="'testSuite_Postamble'"/>
            
opends/tests/staf-tests/stress-tests/testcases/ldap_operation/ldclt_search.xml
@@ -49,7 +49,7 @@
            searchLoop      = testsDuration / 10
            lowRange        = 100000
            highRange       = lowRange + numberOfEntries
            jvmLoop         = testsDuration / 1800
            jvmLoop         = testsDuration / 1800 + 1
            jvmSleep        = 1800000
            baseDN          = 'ou=People,dc=com'
            ldcltDir        = '%s/ldclt_dir' % TMPDIR
@@ -235,9 +235,11 @@
                            }
                          </call>
                          <call function="'Sleep'">
                            { 'sleepForMilliSeconds'  : jvmSleep }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
@@ -255,6 +257,19 @@
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_search.res from %s to %s on %s' \
                % (ldcltDir,STAF_CLIENT_HOSTNAME,logs.sut,STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'srcfile'    : '%s/ldclt_search.res' % ldcltDir ,
                'destfile'   : '%s/ldclt_search.res' % logs.sut ,
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
@@ -289,7 +304,9 @@
          
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/ldap_operation/ldap_operation_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'ldap_operation_cleanup'" />
          <call function="'ldap_operation_cleanup'">
            { 'suiteSuffix' : 'search' }
          </call>
          <call function="'testSuite_Postamble'"/>
            
opends/tests/staf-tests/stress-tests/testcases/replication/replication.xml
New file
@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="main_replication"/>
  <function name="main_replication">
    <function-list-args>
      <function-required-arg name="STAXParentID"/>
    </function-list-args>
    <sequence>
      <block name="'replication'">
        <sequence>
          <!--- Load the job environment for the test group execution -->
          <import machine="STAF_LOCAL_HOSTNAME"
                file="'%s/environment.xml' % TESTS_FUNCTIONS_DIR"/>
          <call function="'loadJobEnvironment'">
            { 'parent' : STAXParentID }
          </call>
          <script>
            CurrentTestPath['group']='replication'
            timerDuration = '620m'
            # Time in second (minimum duration: 30 min => 1800 s)
            testsDuration   = 1800
            numberOfEntries = 10000
          </script>
          <call function="'testGroup_Preamble'"/>
          <script>
            testList = []
            testList.append('replication_add_delete')
            testList.append('replication_search')
            testList.append('replication_modifyrdn')
            testList.append('replication_modify')
            testList.append('replication_add_mod_delete')
            testList.append('replication_add_mod_delete_search')
            testList.append('replication_add_search_multiple')
            testList.append('replication_add_delete_multiple')
            testList.append('replication_add_modify_multiple')
            testList.append('replication_add_del_add_del_multiple')
            testList.append('replication_modify_multiple')
            testList.append('replication_modify_modifyrdn_multiple')
            testList.append('replication_modifyrdn_multiple')
            #testList.append('replication_modify_restart_multiple')
            globalAssuredReplication = None
          </script>
          <iterate var="__test" in="testList">
            <sequence>
              <import machine="STAF_LOCAL_HOSTNAME"
                      file="'%s/testcases/replication/%s.xml' %
                      (TESTS_DIR,__test)"/>
              <call function="'%s' % __test" />
            </sequence>
          </iterate>
          <call function="'testGroup_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_add_del_add_del_multiple.xml
New file
@@ -0,0 +1,528 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_add_del_add_del_multiple"/>
  <function name="replication_add_del_add_del_multiple">
    <sequence>
      <block name="'replication-add-del-add-del-multiple'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            ldcltDir      = '%s/ldclt_dir' % TMPDIR
            ldcltTemplate = '%s/ldclt_add.template' % ldcltDir
            server1Host   = server1.getHostname()
            server1Path   = '%s/%s' % (server1.getDir(),OPENDSNAME)
            server1Dir    = server1.getDir()
            server2Host   = server2.getHostname()
            server2Path   = '%s/%s' % (server2.getDir(),OPENDSNAME)
            server2Dir    = server2.getDir()
            suffix        = 'add_del_add_del_multiple'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_del_add_del_multiple: Delete %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'deleteFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_del_add_del_multiple: Create %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'createFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_del_add_del_multiple: Create ldclt template'
              </message>
              <call function="'MakeALdcltTemplate'">
                {
                'templateFile'     : ldcltTemplate ,
                'templateLocation' : STAF_CLIENT_HOSTNAME
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_add_del_add_del_multiple: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-add-threads-server1'">
                    <sequence>
                      <message>
                        'replication_add_del_add_del_multiple: add threads on %s:%s' \
                        % (server1Host, server1.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -e object=%s' % ldcltTemplate
                        opt2 = '-e "rdn=uid:user.[C=INCRN(%s;%s;6)]"' \
                                % (lowRange, highRange)
                        opt3 = '-e add -N %s -I 68 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : server1Host,
                      'dsInstancePort' : server1.getPort(),
                      'dsInstanceDn'   : server1.getRootDn(),
                      'dsInstancePswd' : server1.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_add-%s_1.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-delete-threads-server1'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 120000 }
                      </call>
                      <message>
                        'replication_add_del_add_del_multiple: delete threads on %s:%s' \
                        % (server1Host, server1.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e delete,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : server1Host,
                      'dsInstancePort' : server1.getPort(),
                      'dsInstanceDn'   : server1.getRootDn(),
                      'dsInstancePswd' : server1.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_delete-%s_1.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-add-threads-server2'">
                    <sequence>
                      <message>
                        'replication_add_del_add_del_multiple: add threads on %s:%s' \
                        % (server2Host, server2.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -e object=%s' % ldcltTemplate
                        opt2 = '-e "rdn=uid:user.[C=INCRN(%s;%s;6)]"' \
                                % (lowRange, highRange)
                        opt3 = '-e add -N %s -I 68 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : server2Host,
                      'dsInstancePort' : server2.getPort(),
                      'dsInstanceDn'   : server2.getRootDn(),
                      'dsInstancePswd' : server2.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_add-%s_2.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-delete-threads-server2'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 120000 }
                      </call>
                      <message>
                        'replication_add_del_add_del_multiple: delete threads on %s:%s' \
                        % (server2Host, server2.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e delete,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : server2Host,
                      'dsInstancePort' : server2.getPort(),
                      'dsInstanceDn'   : server2.getRootDn(),
                      'dsInstancePswd' : server2.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_delete-%s_2.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_add_del_add_del_multiple: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server1Host,
                              'dsPath'         : server1Path,
                              'dsInstanceHost' : server1Host,
                              'dsInstancePort' : server1.getPort(),
                              'dsInstanceDn'   : server1.getRootDn(),
                              'dsInstancePswd' : server1.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server1Dir
                            }
                          </call>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server2Host,
                              'dsPath'         : server2Path,
                              'dsInstanceHost' : server2Host,
                              'dsInstancePort' : server2.getPort(),
                              'dsInstanceDn'   : server2.getRootDn(),
                              'dsInstancePswd' : server2.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server2Dir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_add-%s_1.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_add-%s_1.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_add-%s_1.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_delete-%s_1.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_delete-%s_1.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_delete-%s_1.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_add-%s_2.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_add-%s_2.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_add-%s_2.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_delete-%s_2.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_delete-%s_2.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_delete-%s_2.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_add_del_add_del_multiple: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_del_add_del_multiple: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_del_add_del_multiple: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_del_add_del_multiple: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_add_delete.xml
New file
@@ -0,0 +1,411 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_add_delete"/>
  <function name="replication_add_delete">
    <sequence>
      <block name="'replication-add-delete'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            ldcltDir      = '%s/ldclt_dir' % TMPDIR
            ldcltTemplate = '%s/ldclt_add.template' % ldcltDir
            masterDir     = '%s/..' % masterPath
            suffix        = 'add_delete'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_delete: Delete %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'deleteFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_delete: Create %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'createFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_delete: Create ldclt template'
              </message>
              <call function="'MakeALdcltTemplate'">
                {
                'templateFile'     : ldcltTemplate ,
                'templateLocation' : STAF_CLIENT_HOSTNAME
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_add_delete: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-add-threads'">
                    <sequence>
                      <message>
                        'replication_add_delete: add threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -e object=%s' % ldcltTemplate
                        opt2 = '-e "rdn=uid:user.[C=INCRN(%s;%s;6)]"' \
                                % (lowRange, highRange)
                        opt3 = '-e add -N %s -I 68 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : masterHost,
                      'dsInstancePort' : master.getPort(),
                      'dsInstanceDn'   : master.getRootDn(),
                      'dsInstancePswd' : master.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_add-%s.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-delete-threads'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 120000 }
                      </call>
                      <message>
                        'replication_add_delete: delete threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e delete,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : masterHost,
                      'dsInstancePort' : master.getPort(),
                      'dsInstanceDn'   : master.getRootDn(),
                      'dsInstancePswd' : master.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_delete-%s.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_add_delete: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : masterHost,
                              'dsPath'         : masterPath,
                              'dsInstanceHost' : masterHost,
                              'dsInstancePort' : master.getPort(),
                              'dsInstanceDn'   : master.getRootDn(),
                              'dsInstancePswd' : master.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' % (suffix, loop),
                              'outputPath'     : masterDir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_add-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_add-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_add-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_delete-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_delete-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_delete-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_add_delete: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_delete: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_delete: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_delete: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_add_delete_multiple.xml
New file
@@ -0,0 +1,436 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_add_delete_multiple"/>
  <function name="replication_add_delete_multiple">
    <sequence>
      <block name="'replication-add-delete-multiple'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            ldcltDir      = '%s/ldclt_dir' % TMPDIR
            ldcltTemplate = '%s/ldclt_add.template' % ldcltDir
            server1Host   = server1.getHostname()
            server1Path   = '%s/%s' % (server1.getDir(),OPENDSNAME)
            server1Dir    = server1.getDir()
            server2Host   = server2.getHostname()
            server2Path   = '%s/%s' % (server2.getDir(),OPENDSNAME)
            server2Dir    = server2.getDir()
            suffix        = 'add_delete_multiple'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_delete_multiple: Delete %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'deleteFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_delete_multiple: Create %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'createFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_delete_multiple: Create ldclt template'
              </message>
              <call function="'MakeALdcltTemplate'">
                {
                'templateFile'     : ldcltTemplate ,
                'templateLocation' : STAF_CLIENT_HOSTNAME
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_add_delete_multiple: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-add-threads-server1'">
                    <sequence>
                      <message>
                        'replication_add_delete_multiple: add threads on %s:%s' \
                        % (server1Host, server1.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -e object=%s' % ldcltTemplate
                        opt2 = '-e "rdn=uid:user.[C=INCRN(%s;%s;6)]"' \
                                % (lowRange, highRange)
                        opt3 = '-e add -N %s -I 68 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : server1Host,
                      'dsInstancePort' : server1.getPort(),
                      'dsInstanceDn'   : server1.getRootDn(),
                      'dsInstancePswd' : server1.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_add-%s_1.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-delete-threads-server2'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 120000 }
                      </call>
                      <message>
                        'replication_add_delete_multiple: delete threads on %s:%s' \
                        % (server2Host, server2.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e delete,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : server2Host,
                      'dsInstancePort' : server2.getPort(),
                      'dsInstanceDn'   : server2.getRootDn(),
                      'dsInstancePswd' : server2.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_delete-%s_2.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_add_delete_multiple: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server1Host,
                              'dsPath'         : server1Path,
                              'dsInstanceHost' : server1Host,
                              'dsInstancePort' : server1.getPort(),
                              'dsInstanceDn'   : server1.getRootDn(),
                              'dsInstancePswd' : server1.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server1Dir
                            }
                          </call>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server2Host,
                              'dsPath'         : server2Path,
                              'dsInstanceHost' : server2Host,
                              'dsInstancePort' : server2.getPort(),
                              'dsInstanceDn'   : server2.getRootDn(),
                              'dsInstancePswd' : server2.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server2Dir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_add-%s_1.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_add-%s_1.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_add-%s_1.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_delete-%s_2.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_delete-%s_2.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_delete-%s_2.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_add_delete_multiple: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_delete_multiple: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_delete_multiple: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_delete_multiple: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_add_mod_delete.xml
New file
@@ -0,0 +1,460 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_add_mod_delete"/>
  <function name="replication_add_mod_delete">
    <sequence>
      <block name="'replication-add-mod-delete'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            ldcltDir      = '%s/ldclt_dir' % TMPDIR
            ldcltTemplate = '%s/ldclt_add.template' % ldcltDir
            masterDir     = '%s/..' % masterPath
            suffix        = 'add_mod_delete'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_mod_delete: Delete %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'deleteFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_mod_delete: Create %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'createFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_mod_delete: Create ldclt template'
              </message>
              <call function="'MakeALdcltTemplate'">
                {
                'templateFile'     : ldcltTemplate ,
                'templateLocation' : STAF_CLIENT_HOSTNAME
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_add_mod_delete: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-add-threads'">
                    <sequence>
                      <message>
                        'replication_add_mod_delete: add threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -e object=%s' % ldcltTemplate
                        opt2 = '-e "rdn=uid:user.[C=INCRN(%s;%s;6)]"' \
                                % (lowRange, highRange)
                        opt3 = '-e add -N %s -I 68 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : masterHost,
                      'dsInstancePort' : master.getPort(),
                      'dsInstanceDn'   : master.getRootDn(),
                      'dsInstancePswd' : master.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_add-%.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-modify-threads'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 120000 }
                      </call>
                      <message>
                        'replication_add_mod_delete: modify threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-e attreplace=\"description: random modify XXXXXX\"'
                        opt4 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s %s' % (opt1, opt2, opt3, opt4)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : masterHost,
                          'dsInstancePort' : master.getPort(),
                          'dsInstanceDn'   : master.getRootDn(),
                          'dsInstancePswd' : master.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modify-%s.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-delete-threads'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 240000 }
                      </call>
                      <message>
                        'replication_add_mod_delete: delete threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e delete,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : masterHost,
                      'dsInstancePort' : master.getPort(),
                      'dsInstanceDn'   : master.getRootDn(),
                      'dsInstancePswd' : master.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_delete-%s.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_add_mod_delete: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : masterHost,
                              'dsPath'         : masterPath,
                              'dsInstanceHost' : masterHost,
                              'dsInstancePort' : master.getPort(),
                              'dsInstanceDn'   : master.getRootDn(),
                              'dsInstancePswd' : master.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : masterDir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_add-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_add-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_add-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_modify-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modify-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modify-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_delete-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_delete-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_delete-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_add_mod_delete: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_mod_delete: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_mod_delete: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_mod_delete: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_add_mod_delete_search.xml
New file
@@ -0,0 +1,507 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_add_mod_delete_search"/>
  <function name="replication_add_mod_delete_search">
    <sequence>
      <block name="'replication-add-mod-delete-search'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            ldcltDir      = '%s/ldclt_dir' % TMPDIR
            ldcltTemplate = '%s/ldclt_add.template' % ldcltDir
            masterDir     = '%s/..' % masterPath
            suffix        = 'add_mod_delete_search'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_mod_delete_search: Delete %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'deleteFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_mod_delete_search: Create %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'createFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_mod_delete_search: Create ldclt template'
              </message>
              <call function="'MakeALdcltTemplate'">
                {
                'templateFile'     : ldcltTemplate ,
                'templateLocation' : STAF_CLIENT_HOSTNAME
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_add_mod_delete_search: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-add-threads'">
                    <sequence>
                      <message>
                        'replication_add_mod_delete_search: add threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -e object=%s' % ldcltTemplate
                        opt2 = '-e "rdn=uid:user.[C=INCRN(%s;%s;6)]"' \
                                % (lowRange, highRange)
                        opt3 = '-e add -N %s -I 68 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : masterHost,
                      'dsInstancePort' : master.getPort(),
                      'dsInstanceDn'   : master.getRootDn(),
                      'dsInstancePswd' : master.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_add-%s.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-modify-threads'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 120000 }
                      </call>
                      <message>
                        'replication_add_mod_delete_search: modify threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-e attreplace=\"description: random modify XXXXXX\"'
                        opt4 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s %s' % (opt1, opt2, opt3, opt4)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : masterHost,
                          'dsInstancePort' : master.getPort(),
                          'dsInstanceDn'   : master.getRootDn(),
                          'dsInstancePswd' : master.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modify-%s.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-delete-threads'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 240000 }
                      </call>
                      <message>
                        'replication_add_mod_delete_search: delete threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e delete,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : masterHost,
                      'dsInstancePort' : master.getPort(),
                      'dsInstanceDn'   : master.getRootDn(),
                      'dsInstancePswd' : master.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_delete-%s.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-search-threads'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 120000 }
                      </call>
                      <message>
                        'replication_add_mod_delete_search: search threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -r %s -R %s' \
                                % (lowRange, highRange)
                        opt2 = '-e esearch,random -f uid=user.XXXXXX'
                        opt3 = '-N %s -I 32 -v -q' % searchLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : masterHost,
                          'dsInstancePort' : master.getPort(),
                          'dsInstanceDn'   : master.getRootDn(),
                          'dsInstancePswd' : master.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_search-%s.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_add_mod_delete_search: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : masterHost,
                              'dsPath'         : masterPath,
                              'dsInstanceHost' : masterHost,
                              'dsInstancePort' : master.getPort(),
                              'dsInstanceDn'   : master.getRootDn(),
                              'dsInstancePswd' : master.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : masterDir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_add-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_add-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_add-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_modify-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modify-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modify-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_search-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_search-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_search-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_delete-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_delete-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_delete-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_add_mod_delete_search: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_mod_delete_search: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_mod_delete_search: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_mod_delete_search: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_add_modify_multiple.xml
New file
@@ -0,0 +1,437 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_add_modify_multiple"/>
  <function name="replication_add_modify_multiple">
    <sequence>
      <block name="'replication-add-modify-multiple'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            ldcltDir      = '%s/ldclt_dir' % TMPDIR
            ldcltTemplate = '%s/ldclt_add.template' % ldcltDir
            server1Host   = server1.getHostname()
            server1Path   = '%s/%s' % (server1.getDir(),OPENDSNAME)
            server1Dir    = server1.getDir()
            server2Host   = server2.getHostname()
            server2Path   = '%s/%s' % (server2.getDir(),OPENDSNAME)
            server2Dir    = server2.getDir()
            suffix        = 'add_modify_multiple'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_modify_multiple: Delete %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'deleteFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_modify_multiple: Create %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'createFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_modify_multiple: Create ldclt template'
              </message>
              <call function="'MakeALdcltTemplate'">
                {
                'templateFile'     : ldcltTemplate ,
                'templateLocation' : STAF_CLIENT_HOSTNAME
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_add_modify_multiple: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-add-threads-server1'">
                    <sequence>
                      <message>
                        'replication_add_modify_multiple: add threads on %s:%s' \
                        % (server1Host, server1.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -e object=%s' % ldcltTemplate
                        opt2 = '-e "rdn=uid:user.[C=INCRN(%s;%s;6)]"' \
                                % (lowRange, highRange)
                        opt3 = '-e add -N %s -I 68 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : server1Host,
                      'dsInstancePort' : server1.getPort(),
                      'dsInstanceDn'   : server1.getRootDn(),
                      'dsInstancePswd' : server1.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_add-%s_1.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-modify-threads-server2'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 120000 }
                      </call>
                      <message>
                        'replication_add_modify_multiple: modify threads on %s:%s' \
                        % (server2Host, server2.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-e attreplace=\"description: random modify XXXXXX\"'
                        opt4 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s %s' % (opt1, opt2, opt3, opt4)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : server2Host,
                          'dsInstancePort' : server2.getPort(),
                          'dsInstanceDn'   : server2.getRootDn(),
                          'dsInstancePswd' : server2.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modify-%s_2.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_add_modify_multiple: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server1Host,
                              'dsPath'         : server1Path,
                              'dsInstanceHost' : server1Host,
                              'dsInstancePort' : server1.getPort(),
                              'dsInstanceDn'   : server1.getRootDn(),
                              'dsInstancePswd' : server1.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server1Dir
                            }
                          </call>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server2Host,
                              'dsPath'         : server2Path,
                              'dsInstanceHost' : server2Host,
                              'dsInstancePort' : server2.getPort(),
                              'dsInstanceDn'   : server2.getRootDn(),
                              'dsInstancePswd' : server2.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server2Dir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_add-%s_1.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_add-%s_1.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_add-%s_1.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_modify-%s_2.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modify-%s_2.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modify-%s_2.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_add_modify_multiple: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_modify_multiple: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_modify_multiple: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_modify_multiple: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_add_search_multiple.xml
New file
@@ -0,0 +1,436 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_add_search_multiple"/>
  <function name="replication_add_search_multiple">
    <sequence>
      <block name="'replication-add-search-multiple'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            ldcltDir      = '%s/ldclt_dir' % TMPDIR
            ldcltTemplate = '%s/ldclt_add.template' % ldcltDir
            server1Host   = server1.getHostname()
            server1Path   = '%s/%s' % (server1.getDir(),OPENDSNAME)
            server1Dir    = server1.getDir()
            server2Host   = server2.getHostname()
            server2Path   = '%s/%s' % (server2.getDir(),OPENDSNAME)
            server2Dir    = server2.getDir()
            suffix        = 'add_search_multiple'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_search_multiple: Delete %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'deleteFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_search_multiple: Create %s on %s' \
                % (ldcltDir, STAF_CLIENT_HOSTNAME)
              </message>
              <call function="'createFolder'">
                {
                'location'   : STAF_CLIENT_HOSTNAME ,
                'foldername' : ldcltDir
                }
              </call>
              <message>
                'replication_add_search_multiple: Create ldclt template'
              </message>
              <call function="'MakeALdcltTemplate'">
                {
                'templateFile'     : ldcltTemplate ,
                'templateLocation' : STAF_CLIENT_HOSTNAME
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_search_multiple: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-add-threads-server1'">
                    <sequence>
                      <message>
                        'replication_add_search_multiple: add threads on %s:%s' \
                        % (server1Host, server1.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -e object=%s' % ldcltTemplate
                        opt2 = '-e "rdn=uid:user.[C=INCRN(%s;%s;6)]"' \
                                % (lowRange, highRange)
                        opt3 = '-e add -N %s -I 68 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                      {
                      'location'       : STAF_CLIENT_HOSTNAME,
                      'dsInstanceHost' : server1Host,
                      'dsInstancePort' : server1.getPort(),
                      'dsInstanceDn'   : server1.getRootDn(),
                      'dsInstancePswd' : server1.getRootPwd(),
                      'dsBaseDn'       : baseDN,
                      'ldcltOptions'   : opts,
                      'outputFile'     : 'ldclt_add-%s_1.res' % suffix,
                      'outputPath'     : ldcltDir
                      }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-search-threads-server2'">
                    <sequence>
                      <call function="'Sleep'">
                        { 'sleepForMilliSeconds'  : 120000 }
                      </call>
                      <message>
                        'replication_add_search_multiple: search threads on %s:%s' \
                        % (server2Host, server2.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -r %s -R %s' \
                                % (lowRange, highRange)
                        opt2 = '-e esearch,random -f uid=user.XXXXXX'
                        opt3 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : server2Host,
                          'dsInstancePort' : server2.getPort(),
                          'dsInstanceDn'   : server2.getRootDn(),
                          'dsInstancePswd' : server2.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_search-%s_2.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_add_search_multiple: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server1Host,
                              'dsPath'         : server1Path,
                              'dsInstanceHost' : server1Host,
                              'dsInstancePort' : server1.getPort(),
                              'dsInstanceDn'   : server1.getRootDn(),
                              'dsInstancePswd' : server1.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server1Dir
                            }
                          </call>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server2Host,
                              'dsPath'         : server2Path,
                              'dsInstanceHost' : server2Host,
                              'dsInstancePort' : server2.getPort(),
                              'dsInstanceDn'   : server2.getRootDn(),
                              'dsInstancePswd' : server2.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server2Dir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_add-%s_1.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_add-%s_1.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_add-%s_1.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_search-%s_2.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_search-%s_2.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_search-%s_2.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_add_search_multiple: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_search_multiple: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_search_multiple: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_add_search_multiple: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_modify.xml
New file
@@ -0,0 +1,450 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_modify"/>
  <function name="replication_modify">
    <sequence>
      <block name="'replication-modify'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop    = testsDuration / 10
            lowRange     = 100000
            highRange    = lowRange + numberOfEntries
            jvmLoop      = testsDuration / 1800  + 1
            jvmSleep     = 1800000
            baseDN       = 'ou=People,%s' % synchroSuffix
            ldcltDir     = '%s/ldclt_dir' % TMPDIR
            masterDir    = '%s/..' % masterPath
            ldifTemplate = '%s/%s_entries.template' \
                           % (masterDir, numberOfEntries)
            ldifFile     = '%s/%s_entries.ldif' \
                           % (masterDir, numberOfEntries)
            totalEntries = numberOfEntries + 2
            suffix       = 'modify'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <!-- Check if 'ldifFile' exists -->
              <call function="'GetEntry'">
                {
                'location'  : masterHost ,
                'entry'     : ldifFile ,
                'attribute' : 'TYPE'
                }
              </call>
              <if expr="RC == 48">
                <sequence>
                  <message>
                    'replication_modify: File %s does not exist, create it' \
                    % ldifFile
                  </message>
                  <message>
                    'replication_modify: Make a make-ldif template file'
                  </message>
                  <call function="'MakeAMakeLdifTemplate'">
                    {
                    'numEntries'           : numberOfEntries,
                    'suffix'               : synchroSuffix,
                    'startFrom'            : lowRange,
                    'additionalAttributes' : True,
                    'templateFile'         : ldifTemplate,
                    'templateLocation'     : masterHost
                    }
                  </call>
                  <message>
                    'replication_modify: Make the ldif file'
                  </message>
                  <call function="'MakeLdifWithScript'">
                    {
                    'location'     : masterHost,
                    'dsPath'       : masterPath,
                    'templateFile' : ldifTemplate,
                    'ldifFile'     : ldifFile
                    }
                  </call>
                </sequence>
                <else>
                  <message>
                    'replication_modify: File %s exists, do nothing' % ldifFile
                  </message>
                </else>
              </if>
              <message>
               'replication_modify: Import large ldif file'
              </message>
              <!-- 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,
                  'dsBackEnd'  : DIRECTORY_INSTANCE_BE,
                  'dsLdifFile' : ldifFile
                }
              </call>
              <script>
               returnString = STAXResult[0][1]
              </script>
              <call function="'checktestString'">
                { 'returnString'   : returnString,
                  'expectedString' : 'Processed %s entries' % totalEntries
                }
              </call>
              <message>
                'replication_modify: Start DS running on %s:%s' % \
                (masterHost, master.getPort())
              </message>
              <!-- 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' : 5000
                }
              </call>
              <!-- Perform the total update -->
              <call function="'initializeReplication'">
                { 'location'                : clientHost,
                  'dsPath'                  : clientPath,
                  'sourceInstanceHost'      : masterHost,
                  'sourceInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'       : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_modify: Run ldclt modify'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-modify-threads'">
                    <sequence>
                      <message>
                        'replication_modify: modify threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-e attreplace=\"description: random modify XXXXXX\"'
                        opt4 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s %s' % (opt1, opt2, opt3, opt4)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : masterHost,
                          'dsInstancePort' : master.getPort(),
                          'dsInstanceDn'   : master.getRootDn(),
                          'dsInstancePswd' : master.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modify-%s.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_modify: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : masterHost,
                              'dsPath'         : masterPath,
                              'dsInstanceHost' : masterHost,
                              'dsInstancePort' : master.getPort(),
                              'dsInstanceDn'   : master.getRootDn(),
                              'dsInstancePswd' : master.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' % (suffix, loop),
                              'outputPath'     : masterDir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_modify-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modify-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modify-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_modify: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10 ,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modify: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modify: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modify: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_modify_modifyrdn_multiple.xml
New file
@@ -0,0 +1,519 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_modify_modifyrdn_multiple"/>
  <function name="replication_modify_modifyrdn_multiple">
    <sequence>
      <block name="'replication-modify-modifyrdn-multiple'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            server1Host   = server1.getHostname()
            server1Path   = '%s/%s' % (server1.getDir(),OPENDSNAME)
            server1Dir    = server1.getDir()
            server2Host   = server2.getHostname()
            server2Path   = '%s/%s' % (server2.getDir(),OPENDSNAME)
            server2Dir    = server2.getDir()
            ldifTemplate  = '%s/%s_entries.template' \
                            % (server1Dir, numberOfEntries)
            ldifFile      = '%s/%s_entries.ldif' \
                            % (server1Dir, numberOfEntries)
            totalEntries  = numberOfEntries + 2
            suffix        = 'modify_modifyrdn_multiple'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <!-- Check if 'ldifFile' exists -->
              <call function="'GetEntry'">
                {
                'location'  : server1Host ,
                'entry'     : ldifFile ,
                'attribute' : 'TYPE'
                }
              </call>
              <if expr="RC == 48">
                <sequence>
                  <message>
                    'replication_modify_modifyrdn_multiple: File %s does not exist, create it' \
                    % ldifFile
                  </message>
                  <message>
                    'replication_modify_modifyrdn_multiple: Make a make-ldif template file'
                  </message>
                  <call function="'MakeAMakeLdifTemplate'">
                    {
                    'numEntries'           : numberOfEntries,
                    'suffix'               : synchroSuffix,
                    'startFrom'            : lowRange,
                    'additionalAttributes' : True,
                    'templateFile'         : ldifTemplate,
                    'templateLocation'     : server1Host
                    }
                  </call>
                  <message>
                    'replication_modify_modifyrdn_multiple: Make the ldif file'
                  </message>
                  <call function="'MakeLdifWithScript'">
                    {
                    'location'     : server1Host,
                    'dsPath'       : server1Path,
                    'templateFile' : ldifTemplate,
                    'ldifFile'     : ldifFile
                    }
                  </call>
                </sequence>
                <else>
                  <message>
                    'replication_modify_modifyrdn_multiple: File %s exists, do nothing' % ldifFile
                  </message>
                </else>
              </if>
              <message>
               'replication_modify_modifyrdn_multiple: Import large ldif file'
              </message>
              <!-- Stop "server1" Directory Server -->
              <call function="'StopDsWithScript'">
                { 'location'    : server1Host,
                  'dsPath'      : server1Path,
                  'dsHost'      : server1Host,
                  'dsAdminPort' : server1.getAdminPort(),
                  'dsBindDN'    : server1.getRootDn(),
                  'dsBindPwd'   : server1.getRootPwd()
                }
              </call>
              <!-- Import data into "server1" Directory Server -->
              <call function="'ImportLdifWithScript'">
                { 'location'   : server1Host,
                  'dsPath'     : server1Path,
                  'dsBackEnd'  : DIRECTORY_INSTANCE_BE,
                  'dsLdifFile' : ldifFile
                }
              </call>
              <script>
               returnString = STAXResult[0][1]
              </script>
              <call function="'checktestString'">
                { 'returnString'   : returnString,
                  'expectedString' : 'Processed %s entries' % totalEntries
                }
              </call>
              <message>
                'replication_modify_modifyrdn_multiple: Start DS running on %s:%s' % \
                (server1Host, server1.getPort())
              </message>
              <!-- Start the Directory Server -->
              <call function="'StartDsWithScript'">
                { 'location'  : server1Host,
                  'dsPath'    : server1Path
                }
              </call>
              <!-- Wait for DS to start -->
              <call function="'isAlive'">
                { 'location'         : server1Host,
                  'dsPath'           : server1Path,
                  'dsInstanceHost'   : server1Host,
                  'dsInstancePort'   : server1.getPort(),
                  'dsInstanceDn'     : server1.getRootDn(),
                  'dsInstancePswd'   : server1.getRootPwd(),
                  'noOfLoops'        : 10,
                  'noOfMilliSeconds' : 5000
                }
              </call>
              <!-- Perform the total update -->
              <call function="'initializeReplication'">
                { 'location'                : clientHost,
                  'dsPath'                  : clientPath,
                  'sourceInstanceHost'      : server1Host,
                  'sourceInstanceAdminPort' : server1.getAdminPort(),
                  'replicationDnList'       : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_modify_modifyrdn_multiple: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-modify-threads-server1'">
                    <sequence>
                      <message>
                        'replication_modify_modifyrdn_multiple: modify threads on %s:%s' \
                        % (server1Host, server1.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-e attreplace=\"description: random modify XXXXXX\"'
                        opt4 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s %s' % (opt1, opt2, opt3, opt4)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : server1Host,
                          'dsInstancePort' : server1.getPort(),
                          'dsInstanceDn'   : server1.getRootDn(),
                          'dsInstancePswd' : server1.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modify-%s_1.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-modifyrdn-threads-server2'">
                    <sequence>
                      <message>
                        'replication_modifyrdn: modifyrdn threads on %s:%s' \
                        % (server2Host, server2.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rename,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 68 -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : server2Host,
                          'dsInstancePort' : server2.getPort(),
                          'dsInstanceDn'   : server2.getRootDn(),
                          'dsInstancePswd' : server2.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modifyrdn-%s_2.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_modify_modifyrdn_multiple: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server1Host,
                              'dsPath'         : server1Path,
                              'dsInstanceHost' : server1Host,
                              'dsInstancePort' : server1.getPort(),
                              'dsInstanceDn'   : server1.getRootDn(),
                              'dsInstancePswd' : server1.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server1Dir
                            }
                          </call>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server2Host,
                              'dsPath'         : server2Path,
                              'dsInstanceHost' : server2Host,
                              'dsInstancePort' : server2.getPort(),
                              'dsInstanceDn'   : server2.getRootDn(),
                              'dsInstancePswd' : server2.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server2Dir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_modify-%s_1.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modify-%s_1.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modify-%s_1.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_modifyrdn-%s_2.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modifyrdn-%s_2.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modifyrdn-%s_2.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_modify_modifyrdn_multiple: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modify_modifyrdn_multiple: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modify_modifyrdn_multiple: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modify_modifyrdn_multiple: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_modify_multiple.xml
New file
@@ -0,0 +1,519 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_modify_multiple"/>
  <function name="replication_modify_multiple">
    <sequence>
      <block name="'replication-modify-multiple'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            server1Host   = server1.getHostname()
            server1Path   = '%s/%s' % (server1.getDir(),OPENDSNAME)
            server1Dir    = server1.getDir()
            server2Host   = server2.getHostname()
            server2Path   = '%s/%s' % (server2.getDir(),OPENDSNAME)
            server2Dir    = server2.getDir()
            ldifTemplate  = '%s/%s_entries.template' \
                            % (server1Dir, numberOfEntries)
            ldifFile      = '%s/%s_entries.ldif' \
                            % (server1Dir, numberOfEntries)
            totalEntries  = numberOfEntries + 2
            suffix        = 'modify_multiple'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <!-- Check if 'ldifFile' exists -->
              <call function="'GetEntry'">
                {
                'location'  : server1Host ,
                'entry'     : ldifFile ,
                'attribute' : 'TYPE'
                }
              </call>
              <if expr="RC == 48">
                <sequence>
                  <message>
                    'replication_modify_multiple: File %s does not exist, create it' \
                    % ldifFile
                  </message>
                  <message>
                    'replication_modify_multiple: Make a make-ldif template file'
                  </message>
                  <call function="'MakeAMakeLdifTemplate'">
                    {
                    'numEntries'           : numberOfEntries,
                    'suffix'               : synchroSuffix,
                    'startFrom'            : lowRange,
                    'additionalAttributes' : True,
                    'templateFile'         : ldifTemplate,
                    'templateLocation'     : server1Host
                    }
                  </call>
                  <message>
                    'replication_modify_multiple: Make the ldif file'
                  </message>
                  <call function="'MakeLdifWithScript'">
                    {
                    'location'     : server1Host,
                    'dsPath'       : server1Path,
                    'templateFile' : ldifTemplate,
                    'ldifFile'     : ldifFile
                    }
                  </call>
                </sequence>
                <else>
                  <message>
                    'replication_modify_multiple: File %s exists, do nothing' % ldifFile
                  </message>
                </else>
              </if>
              <message>
               'replication_modify_multiple: Import large ldif file'
              </message>
              <!-- Stop "server1" Directory Server -->
              <call function="'StopDsWithScript'">
                { 'location'    : server1Host,
                  'dsPath'      : server1Path,
                  'dsHost'      : server1Host,
                  'dsAdminPort' : server1.getAdminPort(),
                  'dsBindDN'    : server1.getRootDn(),
                  'dsBindPwd'   : server1.getRootPwd()
                }
              </call>
              <!-- Import data into "server1" Directory Server -->
              <call function="'ImportLdifWithScript'">
                { 'location'   : server1Host,
                  'dsPath'     : server1Path,
                  'dsBackEnd'  : DIRECTORY_INSTANCE_BE,
                  'dsLdifFile' : ldifFile
                }
              </call>
              <script>
               returnString = STAXResult[0][1]
              </script>
              <call function="'checktestString'">
                { 'returnString'   : returnString,
                  'expectedString' : 'Processed %s entries' % totalEntries
                }
              </call>
              <message>
                'replication_modify_multiple: Start DS running on %s:%s' % \
                (server1Host, server1.getPort())
              </message>
              <!-- Start the Directory Server -->
              <call function="'StartDsWithScript'">
                { 'location'  : server1Host,
                  'dsPath'    : server1Path
                }
              </call>
              <!-- Wait for DS to start -->
              <call function="'isAlive'">
                { 'location'         : server1Host,
                  'dsPath'           : server1Path,
                  'dsInstanceHost'   : server1Host,
                  'dsInstancePort'   : server1.getPort(),
                  'dsInstanceDn'     : server1.getRootDn(),
                  'dsInstancePswd'   : server1.getRootPwd(),
                  'noOfLoops'        : 10,
                  'noOfMilliSeconds' : 5000
                }
              </call>
              <!-- Perform the total update -->
              <call function="'initializeReplication'">
                { 'location'                : clientHost,
                  'dsPath'                  : clientPath,
                  'sourceInstanceHost'      : server1Host,
                  'sourceInstanceAdminPort' : server1.getAdminPort(),
                  'replicationDnList'       : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_modify_multiple: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-modify-threads-server1'">
                    <sequence>
                      <message>
                        'replication_modify_multiple: modify threads on %s:%s' \
                        % (server1Host, server1.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-e attreplace=\"description: random modify XXXXXX\"'
                        opt4 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s %s' % (opt1, opt2, opt3, opt4)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : server1Host,
                          'dsInstancePort' : server1.getPort(),
                          'dsInstanceDn'   : server1.getRootDn(),
                          'dsInstancePswd' : server1.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modify-%s_1.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-modify-threads-server2'">
                    <sequence>
                      <message>
                        'replication_modify_multiple: modify threads on %s:%s' \
                        % (server2Host, server2.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-e attreplace=\"description: random modify XXXXXX\"'
                        opt4 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s %s' % (opt1, opt2, opt3, opt4)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : server2Host,
                          'dsInstancePort' : server2.getPort(),
                          'dsInstanceDn'   : server2.getRootDn(),
                          'dsInstancePswd' : server2.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modify-%s_2.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_modify_multiple: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server1Host,
                              'dsPath'         : server1Path,
                              'dsInstanceHost' : server1Host,
                              'dsInstancePort' : server1.getPort(),
                              'dsInstanceDn'   : server1.getRootDn(),
                              'dsInstancePswd' : server1.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server1Dir
                            }
                          </call>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server2Host,
                              'dsPath'         : server2Path,
                              'dsInstanceHost' : server2Host,
                              'dsInstancePort' : server2.getPort(),
                              'dsInstanceDn'   : server2.getRootDn(),
                              'dsInstancePswd' : server2.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server2Dir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_modify-%s_1.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modify-%s_1.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modify-%s_1.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_modify-%s_2.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modify-%s_2.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modify-%s_2.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_modify_multiple: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modify_multiple: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modify_multiple: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modify_multiple: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_modifyrdn.xml
New file
@@ -0,0 +1,450 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_modifyrdn"/>
  <function name="replication_modifyrdn">
    <sequence>
      <block name="'replication-modifyrdn'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + 2 * numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            ldcltDir      = '%s/ldclt_dir' % TMPDIR
            masterDir     = '%s/..' % masterPath
            ldifTemplate  = '%s/%s_entries.template' \
                            % (masterDir, numberOfEntries)
            ldifFile      = '%s/%s_entries.ldif' \
                            % (masterDir, numberOfEntries)
            totalEntries  = numberOfEntries + 2
            suffix        = 'modifyrdn'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <!-- Check if 'ldifFile' exists -->
              <call function="'GetEntry'">
                {
                'location'  : masterHost ,
                'entry'     : ldifFile ,
                'attribute' : 'TYPE'
                }
              </call>
              <if expr="RC == 48">
                <sequence>
                  <message>
                    'replication_modifyrdn: File %s does not exist, create it' \
                    % ldifFile
                  </message>
                  <message>
                    'replication_modifyrdn: Make a make-ldif template file'
                  </message>
                  <call function="'MakeAMakeLdifTemplate'">
                    {
                    'numEntries'           : numberOfEntries,
                    'suffix'               : synchroSuffix,
                    'startFrom'            : lowRange,
                    'additionalAttributes' : True,
                    'templateFile'         : ldifTemplate,
                    'templateLocation'     : masterHost
                    }
                  </call>
                  <message>
                    'replication_modifyrdn: Make the ldif file'
                  </message>
                  <call function="'MakeLdifWithScript'">
                    {
                    'location'     : masterHost,
                    'dsPath'       : masterPath,
                    'templateFile' : ldifTemplate,
                    'ldifFile'     : ldifFile
                    }
                  </call>
                </sequence>
                <else>
                  <message>
                    'replication_modifyrdn: File %s exists, do nothing' \
                    % ldifFile
                  </message>
                </else>
              </if>
              <message>
               'replication_modifyrdn: Import large ldif file'
              </message>
              <!-- 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,
                  'dsBackEnd'  : DIRECTORY_INSTANCE_BE,
                  'dsLdifFile' : ldifFile
                }
              </call>
              <script>
               returnString = STAXResult[0][1]
              </script>
              <call function="'checktestString'">
                { 'returnString'   : returnString,
                  'expectedString' : 'Processed %s entries' % totalEntries
                }
              </call>
              <message>
                'replication_modifyrdn: Start DS running on %s:%s' % \
                (masterHost, master.getPort())
              </message>
              <!-- 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' : 5000
                }
              </call>
              <!-- Perform the total update -->
              <call function="'initializeReplication'">
                { 'location'                : clientHost,
                  'dsPath'                  : clientPath,
                  'sourceInstanceHost'      : masterHost,
                  'sourceInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'       : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_modifyrdn: Run ldclt modify'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-modifyrdn-threads'">
                    <sequence>
                      <message>
                        'replication_modifyrdn: modifyrdn threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rename,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 68 -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : masterHost,
                          'dsInstancePort' : master.getPort(),
                          'dsInstanceDn'   : master.getRootDn(),
                          'dsInstancePswd' : master.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modifyrdn-%s.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_modifyrdn: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : masterHost,
                              'dsPath'         : masterPath,
                              'dsInstanceHost' : masterHost,
                              'dsInstancePort' : master.getPort(),
                              'dsInstanceDn'   : master.getRootDn(),
                              'dsInstancePswd' : master.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' % (suffix, loop),
                              'outputPath'     : masterDir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_modifyrdn-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modifyrdn-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modifyrdn-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_modifyrdn: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modifyrdn: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modifyrdn: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modifyrdn: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_modifyrdn_multiple.xml
New file
@@ -0,0 +1,519 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_modifyrdn_multiple"/>
  <function name="replication_modifyrdn_multiple">
    <sequence>
      <block name="'replication-modifyrdn-multiple'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop     = testsDuration / 10
            lowRange      = 100000
            highRange     = lowRange + numberOfEntries
            jvmLoop       = testsDuration / 1800  + 1
            jvmSleep      = 1800000
            baseDN        = 'ou=People,%s' % synchroSuffix
            server1Host   = server1.getHostname()
            server1Path   = '%s/%s' % (server1.getDir(),OPENDSNAME)
            server1Dir    = server1.getDir()
            server2Host   = server2.getHostname()
            server2Path   = '%s/%s' % (server2.getDir(),OPENDSNAME)
            server2Dir    = server2.getDir()
            ldifTemplate  = '%s/%s_entries.template' \
                            % (server1Dir, numberOfEntries)
            ldifFile      = '%s/%s_entries.ldif' \
                            % (server1Dir, numberOfEntries)
            totalEntries  = numberOfEntries + 2
            suffix        = 'modifyrdn_multiple'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <!-- Check if 'ldifFile' exists -->
              <call function="'GetEntry'">
                {
                'location'  : server1Host ,
                'entry'     : ldifFile ,
                'attribute' : 'TYPE'
                }
              </call>
              <if expr="RC == 48">
                <sequence>
                  <message>
                    'replication_modifyrdn_multiple: File %s does not exist, create it' \
                    % ldifFile
                  </message>
                  <message>
                    'replication_modifyrdn_multiple: Make a make-ldif template file'
                  </message>
                  <call function="'MakeAMakeLdifTemplate'">
                    {
                    'numEntries'           : numberOfEntries,
                    'suffix'               : synchroSuffix,
                    'startFrom'            : lowRange,
                    'additionalAttributes' : True,
                    'templateFile'         : ldifTemplate,
                    'templateLocation'     : server1Host
                    }
                  </call>
                  <message>
                    'replication_modifyrdn_multiple: Make the ldif file'
                  </message>
                  <call function="'MakeLdifWithScript'">
                    {
                    'location'     : server1Host,
                    'dsPath'       : server1Path,
                    'templateFile' : ldifTemplate,
                    'ldifFile'     : ldifFile
                    }
                  </call>
                </sequence>
                <else>
                  <message>
                    'replication_modifyrdn_multiple: File %s exists, do nothing' % ldifFile
                  </message>
                </else>
              </if>
              <message>
               'replication_modifyrdn_multiple: Import large ldif file'
              </message>
              <!-- Stop "server1" Directory Server -->
              <call function="'StopDsWithScript'">
                { 'location'    : server1Host,
                  'dsPath'      : server1Path,
                  'dsHost'      : server1Host,
                  'dsAdminPort' : server1.getAdminPort(),
                  'dsBindDN'    : server1.getRootDn(),
                  'dsBindPwd'   : server1.getRootPwd()
                }
              </call>
              <!-- Import data into "server1" Directory Server -->
              <call function="'ImportLdifWithScript'">
                { 'location'   : server1Host,
                  'dsPath'     : server1Path,
                  'dsBackEnd'  : DIRECTORY_INSTANCE_BE,
                  'dsLdifFile' : ldifFile
                }
              </call>
              <script>
               returnString = STAXResult[0][1]
              </script>
              <call function="'checktestString'">
                { 'returnString'   : returnString,
                  'expectedString' : 'Processed %s entries' % totalEntries
                }
              </call>
              <message>
                'replication_modifyrdn_multiple: Start DS running on %s:%s' % \
                (server1Host, server1.getPort())
              </message>
              <!-- Start the Directory Server -->
              <call function="'StartDsWithScript'">
                { 'location'  : server1Host,
                  'dsPath'    : server1Path
                }
              </call>
              <!-- Wait for DS to start -->
              <call function="'isAlive'">
                { 'location'         : server1Host,
                  'dsPath'           : server1Path,
                  'dsInstanceHost'   : server1Host,
                  'dsInstancePort'   : server1.getPort(),
                  'dsInstanceDn'     : server1.getRootDn(),
                  'dsInstancePswd'   : server1.getRootPwd(),
                  'noOfLoops'        : 10,
                  'noOfMilliSeconds' : 5000
                }
              </call>
              <!-- Perform the total update -->
              <call function="'initializeReplication'">
                { 'location'                : clientHost,
                  'dsPath'                  : clientPath,
                  'sourceInstanceHost'      : server1Host,
                  'sourceInstanceAdminPort' : server1.getAdminPort(),
                  'replicationDnList'       : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_modifyrdn_multiple: Run ldclt add'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-modifyrdn-threads-server1'">
                    <sequence>
                      <message>
                        'replication_modifyrdn: modifyrdn threads on %s:%s' \
                        % (server1Host, server1.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rename,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 68 -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : server1Host,
                          'dsInstancePort' : server1.getPort(),
                          'dsInstanceDn'   : server1.getRootDn(),
                          'dsInstancePswd' : server1.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modifyrdn-%s_1.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-modifyrdn-threads-server2'">
                    <sequence>
                      <message>
                        'replication_modifyrdn: modifyrdn threads on %s:%s' \
                        % (server2Host, server2.getPort())
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1'
                        opt2 = '-e rename,rdn=\"uid:user.[RNDN(%s;%s;6)]\"' \
                                % (lowRange, highRange)
                        opt3 = '-N %s -I 68 -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : server2Host,
                          'dsInstancePort' : server2.getPort(),
                          'dsInstanceDn'   : server2.getRootDn(),
                          'dsInstancePswd' : server2.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_modifyrdn-%s_2.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_modifyrdn_multiple: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server1Host,
                              'dsPath'         : server1Path,
                              'dsInstanceHost' : server1Host,
                              'dsInstancePort' : server1.getPort(),
                              'dsInstanceDn'   : server1.getRootDn(),
                              'dsInstancePswd' : server1.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server1Dir
                            }
                          </call>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : server2Host,
                              'dsPath'         : server2Path,
                              'dsInstanceHost' : server2Host,
                              'dsInstancePort' : server2.getPort(),
                              'dsInstanceDn'   : server2.getRootDn(),
                              'dsInstancePswd' : server2.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' \
                                                 % (suffix, loop),
                              'outputPath'     : server2Dir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_modifyrdn-%s_1.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modifyrdn-%s_1.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modiryrdn-%s_1.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <message>
                'Copy %s/ldclt_modifyrdn-%s_2.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_modifyrdn-%s_2.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_modifyrdn-%s_2.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_modifyrdn_multiple: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modifyrdn_multiple: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modifyrdn_multiple: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_modifyrdn_multiple: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/stress-tests/testcases/replication/replication_search.xml
New file
@@ -0,0 +1,450 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_search"/>
  <function name="replication_search">
    <sequence>
      <block name="'replication-search'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <script>
            ldcltLoop    = testsDuration / 10
            lowRange     = 100000
            highRange    = lowRange + numberOfEntries
            jvmLoop      = testsDuration / 1800 + 1
            jvmSleep     = 1800000
            baseDN       = 'ou=People,%s' % synchroSuffix
            ldcltDir     = '%s/ldclt_dir' % TMPDIR
            masterDir    = '%s/..' % masterPath
            ldifTemplate = '%s/%s_entries.template' \
                           % (masterDir, numberOfEntries)
            ldifFile     = '%s/%s_entries.ldif' \
                           % (masterDir, numberOfEntries)
            totalEntries = numberOfEntries + 2
            suffix       = 'search'
          </script>
          <testcase name="getTestCaseName('Preamble')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <!-- Check if 'ldifFile' exists -->
              <call function="'GetEntry'">
                {
                'location'  : masterHost ,
                'entry'     : ldifFile ,
                'attribute' : 'TYPE'
                }
              </call>
              <if expr="RC == 48">
                <sequence>
                  <message>
                    'replication_search: File %s does not exist, create it' \
                    % ldifFile
                  </message>
                  <message>
                    'replication_search: Make a make-ldif template file'
                  </message>
                  <call function="'MakeAMakeLdifTemplate'">
                    {
                    'numEntries'           : numberOfEntries,
                    'suffix'               : synchroSuffix,
                    'startFrom'            : lowRange,
                    'additionalAttributes' : True,
                    'templateFile'         : ldifTemplate,
                    'templateLocation'     : masterHost
                    }
                  </call>
                  <message>
                    'replication_search: Make the ldif file'
                  </message>
                  <call function="'MakeLdifWithScript'">
                    {
                    'location'     : masterHost,
                    'dsPath'       : masterPath,
                    'templateFile' : ldifTemplate,
                    'ldifFile'     : ldifFile
                    }
                  </call>
                </sequence>
                <else>
                  <message>
                    'replication_search: File %s exists, do nothing' \
                    % ldifFile
                  </message>
                </else>
              </if>
              <message>
               'replication_search: Import large ldif file'
              </message>
              <!-- 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,
                  'dsBackEnd'  : DIRECTORY_INSTANCE_BE,
                  'dsLdifFile' : ldifFile
                }
              </call>
              <script>
               returnString = STAXResult[0][1]
              </script>
              <call function="'checktestString'">
                { 'returnString'   : returnString,
                  'expectedString' : 'Processed 10002 entries'
                }
              </call>
              <message>
                'replication_search: Start DS running on %s:%s' % \
                (masterHost, master.getPort())
              </message>
              <!-- 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' : 5000
                }
              </call>
              <!-- Perform the total update -->
              <call function="'initializeReplication'">
                { 'location'                : clientHost,
                  'dsPath'                  : clientPath,
                  'sourceInstanceHost'      : masterHost,
                  'sourceInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'       : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Run ldclt clients')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'replication_search: Run ldclt search'
              </message>
              <!--<timer duration="timerDuration">
                <sequence>-->
                  <parallel>
                    <block name="'ldclt-search-threads'">
                    <sequence>
                      <message>
                        'replication_search: search threads'
                      </message>
                      <script>
                        opt1 = '-e delayedstartup=1 -r %s -R %s' \
                                % (lowRange, highRange)
                        opt2 = '-e esearch,random -f uid=user.XXXXXX'
                        opt3 = '-N %s -I 32 -v -q' % ldcltLoop
                        opts = '%s %s %s' % (opt1, opt2, opt3)
                      </script>
                      <call function="'ldclt'">
                        { 'location'       : STAF_CLIENT_HOSTNAME,
                          'dsInstanceHost' : masterHost,
                          'dsInstancePort' : master.getPort(),
                          'dsInstanceDn'   : master.getRootDn(),
                          'dsInstancePswd' : master.getRootPwd(),
                          'dsBaseDn'       : baseDN,
                          'ldcltOptions'   : opts,
                          'outputFile'     : 'ldclt_search-%s.res' % suffix,
                          'outputPath'     : ldcltDir
                        }
                      </call>
                    </sequence>
                    </block>
                    <block name="'ldclt-jvm'">
                    <sequence>
                      <loop from="1" to="jvmLoop" var="loop">
                        <sequence>
                          <message>
                            'LOOP %s out of %s' % (loop, jvmLoop)
                          </message>
                          <message>
                            'replication_search: save jvm information'
                          </message>
                          <call function="'ldapSearchWithScript'">
                            { 'location'       : masterHost,
                              'dsPath'         : masterPath,
                              'dsInstanceHost' : masterHost,
                              'dsInstancePort' : master.getPort(),
                              'dsInstanceDn'   : master.getRootDn(),
                              'dsInstancePswd' : master.getRootPwd(),
                              'dsBaseDN'       : 'cn=JVM Memory Usage,cn=monitor',
                              'dsFilter'       : 'objectclass=*',
                              'expectedRC'     : 'noCheck',
                              'outputFile'     : 'jvm_%s_%s.out' % (suffix, loop),
                              'outputPath'     : masterDir
                            }
                          </call>
                          <if expr="loop != jvmLoop">
                            <call function="'Sleep'">
                              { 'sleepForMilliSeconds'  : jvmSleep }
                            </call>
                          </if>
                        </sequence>
                      </loop>
                    </sequence>
                    </block>
                  </parallel>
              <!--</sequence>
              </timer>
              <script>timerRC = RC</script>
              <if expr="timerRC == 0">
                <sequence>
                  <message>'Timer exceeds %s' % timerDuration</message>
                  <tcstatus result="'fail'"/>
                </sequence>
              </if>-->
              <message>
                'Copy %s/ldclt_search-%s.res from %s to %s on %s' % \
                (ldcltDir, suffix, STAF_CLIENT_HOSTNAME, logs.sut, STAXServiceMachine)
              </message>
              <call function="'copyFile'">
                {
                'location'   : STAF_CLIENT_HOSTNAME,
                'srcfile'    : '%s/ldclt_search-%s.res' % (ldcltDir, suffix),
                'destfile'   : '%s/ldclt_search-%s.res' % (logs.sut, suffix),
                'remotehost' : STAXServiceMachine
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check server is still running')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <paralleliterate var="server" in="_topologyServerList" indexvar="i">
                <sequence>
                  <script>
                    serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                  </script>
                  <message>
                   'replication_search: Check server is still running on \
                    %s:%s' % (server.getHostname(), server.getPort())
                  </message>
                  <!-- Modify entry on one of the servers -->
                  <call function="'isAlive'">
                    { 'location'         : server.getHostname(),
                      'dsPath'           : serverPath,
                      'dsInstanceHost'   : server.getHostname(),
                      'dsInstancePort'   : server.getPort(),
                      'dsInstanceDn'     : server.getRootDn(),
                      'dsInstancePswd'   : server.getRootPwd(),
                      'noOfLoops'        : 10,
                      'noOfMilliSeconds' : 5000
                    }
                  </call>
                </sequence>
              </paralleliterate>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify replication')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_search: Verify replication is still working'
              </message>
              <!-- Verify the replication is still working among the servers in
                the topology -->
              <call function="'verifyReplication'">
                [ _topologyServerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Verify tree synchronization')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_search: Verify the tree synchronization'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <testcase name="getTestCaseName('Check replication status')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'replication_search: Check replication status'
              </message>
              <!-- Verify the synchronization of the trees among the servers in
                the topology -->
              <call function="'getReplicationStatus'">
                { 'location'            : masterHost,
                  'dsPath'              : masterPath,
                  'dsInstanceHost'      : masterHost,
                  'dsInstanceAdminPort' : master.getAdminPort(),
                  'replicationDnList'   : [synchroSuffix]
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/../functional-tests/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'">
            { 'suiteSuffix' : suffix }
          </call>
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>