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

ugaston
04.13.2007 3df7b26c6810ef008d6365a8f086dbed38adab12
New replication test suites + a few fixes in existing functions
7 files added
10 files modified
2168 ■■■■ changed files
opends/tests/functional-tests/shared/data/replication/testuser-0.ldif 8 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/shared/data/replication/testuser-1.ldif 10 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/shared/data/replication/tfitter.ldif 15 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/shared/functions/dsadm.xml 28 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/shared/functions/stafcmd.xml 8 ●●●● patch | view | raw | blame | history
opends/tests/functional-tests/shared/functions/tools.xml 276 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/shared/functions/topology.xml 2 ●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/basic/replication_basic.xml 476 ●●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/basic/replication_basic_setup.xml 3 ●●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/replication.xml 20 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/replication_cleanup.xml 32 ●●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/replication_setup.xml 47 ●●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/totalupdate/replication_binarycopy.xml 302 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/totalupdate/replication_ldifimport.xml 300 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/totalupdate/replication_resynchronization.xml 316 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/totalupdate/replication_schema.xml 313 ●●●●● patch | view | raw | blame | history
opends/tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml 12 ●●●● patch | view | raw | blame | history
opends/tests/functional-tests/shared/data/replication/testuser-0.ldif
New file
@@ -0,0 +1,8 @@
dn: cn=testuser-0,ou=people,o=example
objectclass: top
objectclass: person
objectclass: testobjectclass-0
cn: testuser-0
sn: Test
c: Testland
street: Test Lane
opends/tests/functional-tests/shared/data/replication/testuser-1.ldif
New file
@@ -0,0 +1,10 @@
dn: cn=testuser-1,ou=people,o=example
objectclass: top
objectclass: person
objectclass: testobjectclass-1
cn: testuser-1
sn: Test
c: Testland
street: Test Lane
testattribute-1: new test attribute
opends/tests/functional-tests/shared/data/replication/tfitter.ldif
New file
@@ -0,0 +1,15 @@
dn: uid=tfitter, ou=People,o=example
cn: Tom Fitter
sn: Fitter
givenname: Tom
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
ou: Accounting
ou: People
l: Sunnyvale
uid: tfitter
mail: tfitter@example.com
userpassword: hamstring
opends/tests/functional-tests/shared/functions/dsadm.xml
@@ -1230,6 +1230,7 @@
      <!-- Local variables -->
      <script>
        myLocation=location
        myPath=dsPath
        taskLdifFile='import-task.ldif'
        taskLdif='%s/../%s/%s' % (dsPath,relativeDataDir,taskLdifFile)
        tmpTaskLdif='%s/%s' % (logsTempDir,taskLdifFile)
@@ -1301,6 +1302,7 @@
      <!-- Start the task using ldap task interface -->
      <call function="'StartLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'taskLabel'  : 'Online Import Task',
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -1314,6 +1316,7 @@
        <sequence>
          <call function="'CheckLdapTask'">
            { 'location'   : myLocation,
              'dsPath'  :  myPath,
              'dsTaskDn'   : taskDN,
              'dsHost'     : dsInstanceHost,
              'dsPort'     : dsInstancePort,
@@ -1772,6 +1775,7 @@
      <!-- Start the task using ldap task interface -->
      <call function="'StartLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'taskLabel'  : 'Online Export Task',
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -1785,6 +1789,7 @@
        <sequence>
            <call function="'CheckLdapTask'">
            { 'location'   : myLocation,
              'dsPath'  :  myPath,
              'dsTaskDn'   : taskDN,
              'dsHost'     : dsInstanceHost,
              'dsPort'     : dsInstancePort,
@@ -1839,6 +1844,8 @@
      <!-- Local variables -->
      <script>
        myLocation=location
        if dsPath:
          dsBinPath='%s/%s' % (dsPath,fileFolder)
      </script>
      <message>
        'backup%s -n %s -d %s %s' % (fileExt,backEnd,backupDir,extraParams)
@@ -1973,6 +1980,7 @@
    
       <script>
        myLocation=location
        myPath=dsPath
        taskLdifFile='backup-task.ldif'
        taskLdif='%s/../%s/%s' % (dsPath,relativeDataDir,taskLdifFile)
        tmpTaskLdif='%s/%s' % (logsTempDir,taskLdifFile)
@@ -2026,6 +2034,7 @@
      <!-- Start the task using ldap task interface -->
      <call function="'StartLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'taskLabel'  : 'Online Backup Task',
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -2039,6 +2048,7 @@
        <sequence>
            <call function="'CheckLdapTask'">
            { 'location'   : myLocation,
              'dsPath'  :  myPath,
              'dsTaskDn'   : taskDN,
              'dsHost'     : dsInstanceHost,
              'dsPort'     : dsInstancePort,
@@ -2087,6 +2097,8 @@
      <!-- Local variables -->
      <script>
        myLocation=location
        if dsPath:
          dsBinPath='%s/%s' % (dsPath,fileFolder)
      </script>    
      <message>
@@ -2187,6 +2199,7 @@
    
       <script>
        myLocation=location
        myPath=dsPath
        taskLdifFile='restore-task.ldif'
        taskLdif='%s/../%s/%s' % (dsPath,relativeDataDir,taskLdifFile)
        tmpTaskLdif='%s/%s' % (logsTempDir,taskLdifFile)
@@ -2232,6 +2245,7 @@
      <!-- Start the task using ldap task interface -->
      <call function="'StartLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'taskLabel'  : 'Online Restore Task',
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -2245,6 +2259,7 @@
        <sequence>
            <call function="'CheckLdapTask'">
            { 'location'   : myLocation,
              'dsPath'  :  myPath,
              'dsTaskDn'   : taskDN,
              'dsHost'     : dsInstanceHost,
              'dsPort'     : dsInstancePort,
@@ -2312,6 +2327,7 @@
      <!-- Local variables -->
      <script>
        myLocation=location
        myPath=dsPath
        taskLdifFile='shutdown-task.ldif'
        taskLdif='%s/../%s/%s' % (dsPath,relativeDataDir,taskLdifFile)
        tmpTaskLdif='%s/%s' % (logsTempDir,taskLdifFile)
@@ -2352,6 +2368,7 @@
      <!-- Start the task using ldap task interface -->
      <call function="'StartLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'taskLabel'  : 'Online Export Task',
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -2420,6 +2437,7 @@
      <!-- Local variables -->
      <script>
        myLocation=location
        myPath=dsPath
        taskLdifFile='restart-task.ldif'
        taskLdif='%s/../%s/%s' % (dsPath,relativeDataDir,taskLdifFile)
        tmpTaskLdif='%s/%s' % (logsTempDir,taskLdifFile)
@@ -2460,6 +2478,7 @@
      <!-- Start the task using ldap task interface -->
      <call function="'StartLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'taskLabel'  : 'Online Export Task',
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -2544,6 +2563,7 @@
         <script>
          myLocation=location
          myPath=dsPath
          taskLdifFile='schema.ldif'
          taskLdif='%s/../%s/%s' % (dsPath,relativeDataDir,taskLdifFile)
          tmpTaskLdif='%s/%s' % (logsTempDir,taskLdifFile)
@@ -2595,6 +2615,7 @@
      <!-- Start the task using ldap task interface -->
      <call function="'StartLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'taskLabel'  : 'Online Schema Task',
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -2606,6 +2627,7 @@
      <!-- Check that the ldap task is completed -->
      <call function="'CheckLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'dsTaskDn'   : taskDN,
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -2671,6 +2693,7 @@
         <script>
          myLocation=location
          myPath=dsPath
          taskLdifFile='leaveShutdownTask.ldif'
          taskLdif='%s/../%s/%s' % (dsPath,relativeDataDir,taskLdifFile)
          tmpTaskLdif='%s/%s' % (logsTempDir,taskLdifFile)
@@ -2720,6 +2743,7 @@
      <!-- Start the task using ldap task interface -->
      <call function="'StartLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'taskLabel'  : 'Online Schema Task',
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -2731,6 +2755,7 @@
      <!-- Check that the ldap task is completed -->
      <call function="'CheckLdapTask'">
        { 'location'   : myLocation,
          'dsPath'  :  myPath,
          'dsTaskDn'   : taskDN,
          'dsHost'     : dsInstanceHost,
          'dsPort'     : dsInstancePort,
@@ -3208,5 +3233,6 @@
    </sequence>
    
  </function>
</stax>
opends/tests/functional-tests/shared/functions/stafcmd.xml
@@ -85,6 +85,12 @@
        </function-arg-description>
        <function-arg-property name="type" value="hostname"/>
      </function-arg-def>
      <function-arg-def name="remotehost" type="optional" default="location">
        <function-arg-description>
          The name of remote host (default same as location)
        </function-arg-description>
        <function-arg-property name="type" value="hostname"/>
      </function-arg-def>
      <function-arg-def name="srcfolder" type="required">
        <function-arg-description>
          The name of the source folder
@@ -108,7 +114,7 @@
      <stafcmd name="'STAF Command: Copy all %s Files.' % (extension)">
        <location>'%s' % location</location>
        <service>'fs'</service>
        <request>'COPY DIRECTORY %s TODIRECTORY %s TOMACHINE %s EXT %s RECURSE' % (srcfolder,destfolder,location,extension) </request>
        <request>'COPY DIRECTORY %s TODIRECTORY %s TOMACHINE %s EXT %s RECURSE' % (srcfolder,destfolder,remotehost,extension) </request>
      </stafcmd>
      <script>
        cmdRC=RC
opends/tests/functional-tests/shared/functions/tools.xml
@@ -326,12 +326,16 @@
        myRC = 0
        failedServers = []
        failingServerList = ''
        referenceServerPath = '%s/%s' % (referenceServer.getDir(), OPENDSNAME)
        referenceTree = 'referenceTree.ldif'
        sampleTree = 'sampleTree.ldif'
        treeDiffs = 'treeDiffs.ldif'
      </script>
        
       <message>
        'Verify tree %s taking %s as reference.' % (treeSuffix, referenceServerPath)
      </message>
      <!-- Retrieve the tree from the reference server -->
      <call function="'ldapSearchWithScript'">
        { 'location'         : location,
@@ -421,8 +425,278 @@
      
  </function>        
  <function name="verifySchemas">
    <function-prolog>
      This function verifies that a schema file is synchronized all over a group of servers.
    </function-prolog>
    <function-list-args>
      <function-arg-def name="location" type="optional" default="'%s' % STAXServiceMachine">
        <function-arg-description>
          Location of target host
        </function-arg-description>
        <function-arg-property name="type" value="hostname"/>
      </function-arg-def>
     <function-arg-def name="dsPath" type="optional" default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)">
        <function-arg-description>
          Pathname to installation root
        </function-arg-description>
        <function-arg-property name="type" value="filepath"/>
      </function-arg-def>
      <function-arg-def name="referenceServer" type="required">
        <function-arg-description>
          Server that should be taken as reference.
        </function-arg-description>
        <function-arg-property name="type" value="Server"/>
      </function-arg-def>
      <function-arg-def name="serverList" type="required">
        <function-arg-description>
          List of the servers to verify against the referenceServer.
        </function-arg-description>
        <function-arg-property name="type" value="Server-list"/>
      </function-arg-def>
      <function-arg-def name="schemaFile" type="required">
        <function-arg-description>
          Schema file to verify.
        </function-arg-description>
        <function-arg-property name="type" value="filename"/>
      </function-arg-def>
    </function-list-args>
    <sequence>
      <script>
        myRC = 0
        failedServers = []
        failingServerList = ''
        referenceServerPath = '%s/%s' % (referenceServer.getDir(), OPENDSNAME)
        referenceSchema = '%s/config/schema/%s' % (referenceServerPath, schemaFile)
        schemaDiffs = 'schemaDiffs.ldif'
      </script>
      <message>
        'Verify schema file %s taking %s as reference.' % (schemaFile, referenceServerPath)
      </message>
      <iterate var="server" in="serverList">
        <sequence>
          <!-- Copy reference schema file to other server -->
          <call function="'copyFile'">
            { 'location'   :  referenceServer.getHostname(),
              'remotehost'  :  server.getHostname(),
              'srcfile'  :  referenceSchema,
              'destfile' :  '%s/reference_%s' % (server.getDir(), schemaFile) }
          </call>
          <script>
            serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
          </script>
          <!-- Compare this schema to the reference one -->
          <call function="'LdifDiffWithScript'">
            { 'location'  : location,
              'dsPath'  : dsPath,
              'sourceLdif'  : '%s/config/schema/%s' % (serverPath, schemaFile),
              'targetLdif'  : '%s/reference_%s' % (server.getDir(), schemaFile),
              'outputLdif' : '%s/%s' % (server.getDir(), schemaDiffs) }
          </call>
          <script>
            if STAXResult != 0 :
              failedServers.append('%s:%s' % (server.getHostname(), server.getPort()))
          </script>
        </sequence>
      </iterate>
      <if expr="len(failedServers) > 0">
        <!-- If at least one server failed to successfully compare to the reference tree,
           !   return an error, along with the list of the servers that failed to do so -->
        <script>
          myRC = 1
          comma = ','
          failingServerList = 'List of non-synchronized servers (schema verify FAILED): %s ' % comma.join(failedServers)
        </script>
      <else>
        <script>
          failingServerList = 'All servers synchronized (schema verify SUCCEEDED).'
        </script>
      </else>
      </if>
      <call function="'checktestRC'">
        { 'returncode' : myRC,
          'result'     : failingServerList ,
          'expected'   : 0 }
      </call>
      <return> [myRC, failedServers] </return>
    </sequence>
  </function>
    
    
  <function name="deleteTrees">
    <function-prolog>
      This function deletes a (sub)tree from a list of servers.
    </function-prolog>
    <function-list-args>
      <function-arg-def name="serverList" type="required">
        <function-arg-description>
          List of the servers (instances of "Server" class) where the tree will be deleted.
        </function-arg-description>
        <function-arg-property name="type" value="Server-list"/>
      </function-arg-def>
      <function-arg-def name="treeSuffix" type="required">
        <function-arg-description>
          Suffix of the tree to delete.
        </function-arg-description>
        <function-arg-property name="type" value="DN"/>
      </function-arg-def>
      <function-arg-def name="startDS" type="optional" default="True">
        <function-arg-description>
          Need to start the Directory Servers before deleting.
        </function-arg-description>
        <function-arg-property name="type" value="boolean"/>
      </function-arg-def>
    </function-list-args>
    <sequence>
      <if expr="startDS">
        <!-- Start the servers in the list -->
        <call function="'startServers'">
          [serverList]
        </call>
      </if>
      <!-- Delete the tree in every server in the list -->
      <paralleliterate var="server" in="serverList">
        <sequence>
          <message>
            'Delete suffix %s on server running on host %s on port %s' % (treeSuffix, server.getHostname(), server.getPort())
          </message>
          <!-- Delete suffix and subtree -->
          <call function="'ldapDeleteWithScript'">
            { 'location'  :  server.getHostname(),
              'dsPath'  :  '%s/%s' % (server.getDir(),OPENDSNAME),
              'dsInstanceHost'  :  server.getHostname(),
              'dsInstancePort'  :  server.getPort(),
              'dsInstanceDn'  : server.getRootDn(),
              'dsInstancePswd' :  server.getRootPwd(),
              'dsDn'  :  [treeSuffix],
              'dsDeleteSubtree'  :  True }
          </call>
        </sequence>
      </paralleliterate>
      <if expr="startDS">
        <!-- Stop the servers in the list -->
        <call function="'stopServers'">
          [serverList]
        </call>
      </if>
    </sequence>
  </function>
  <function name="startServers">
    <function-prolog>
      This function starts a list of servers.
    </function-prolog>
    <function-list-args>
      <function-arg-def name="serverList" type="required">
        <function-arg-description>
          List of the servers (instances of "Server" class) to be started.
        </function-arg-description>
        <function-arg-property name="type" value="Server-list"/>
      </function-arg-def>
    </function-list-args>
    <sequence>
      <!-- Start the servers in the list -->
      <paralleliterate var="server" in="serverList">
        <sequence>
          <message>
            'Start DS on host  %s to run on port %s' % (server.getHostname(),server.getPort())
          </message>
          <!--- Start DS -->
          <call function="'StartDsWithScript'">
            { 'location'  : server.getHostname(),
              'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME) }
          </call>
          <!--- Check that DS started -->
          <call function="'isAlive'">
            { 'location' : server.getHostname(),
              'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
              'dsInstanceHost' : server.getHostname(),
              'dsInstancePort' : server.getPort(),
              'dsInstanceDn' : server.getRootDn(),
              'dsInstancePswd' : server.getRootPwd(),
              'noOfLoops' : 5 ,
              'noOfMilliSeconds' : 2000 }
          </call>
        </sequence>
      </paralleliterate>
    </sequence>
  </function>
  <function name="stopServers">
    <function-prolog>
      This function stops a list of servers.
    </function-prolog>
    <function-list-args>
      <function-arg-def name="serverList" type="required">
        <function-arg-description>
          List of the servers (instances of "Server" class) to be stopped.
        </function-arg-description>
        <function-arg-property name="type" value="Server-list"/>
      </function-arg-def>
    </function-list-args>
    <sequence>
      <!-- Stop the servers in the list -->
      <paralleliterate var="server" in="serverList">
        <sequence>
          <message>
            'Stop DS on host  %s running on port %s' % (server.getHostname(),server.getPort())
          </message>
          <!--- Stop DS -->
          <call function="'StopDsWithScript'">
            { 'location'  : server.getHostname(),
              'dsHost' : server.getHostname(),
              'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
              'dsPort'    : server.getPort(),
              'dsBindDN'  : server.getRootDn(),
              'dsBindPwd' : server.getRootPwd() }
          </call>
        </sequence>
      </paralleliterate>
    </sequence>
  </function>
  <function name="CLI_rebuild-index">
    <function-prolog>
      This wraps the rebuild-index tool to make it easy to use from STAX
opends/tests/functional-tests/shared/functions/topology.xml
@@ -600,7 +600,7 @@
      <script>
        replicationServer = syncserver.getChangelogServer()
        replicatedSuffixList = server.getSynchronizedSuffixList()
        replicatedSuffixList = syncserver.getSynchronizedSuffixList()
      </script>        
      <if expr="replicationServer">
opends/tests/functional-tests/testcases/replication/basic/replication_basic.xml
@@ -44,7 +44,18 @@
          </script>
    
          <call function="'testSuite_Preamble'"/>
          <!--- Test Suite information
          #@TestSuiteName       Replication Basic Tests
          #@TestSuitePurpose    Verify that the basic operations are replicated correctly between two serrvers.
          #@TestSuiteID         Basic Tests
          #@TestSuiteGroup      Basic
          #@TestGroup           Replication
          #@TestScript          replication_basic.xml
          #@TestHTMLLink        http://opends.dev.java.net/
          -->
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'" />
@@ -74,10 +85,10 @@
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1.getHostname(),
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication_add_root_suffix.ldif' % clientDataDir }
              </call>
@@ -85,10 +96,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : synchroSuffix ,
                  'dsFilter'         : 'objectclass=*' }                  
              </call>
@@ -96,7 +107,7 @@
                
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>              
                                                   
              <call function="'testCase_Postamble'"/>
@@ -127,19 +138,19 @@
              <call function="'addEntry'">
                { 'location'        : clientHost,
                  'dsPath'          : clientPath,
                  'dsInstanceHost'  : server1.getHostname(),
                  'dsInstancePort'  : server1.getPort() ,
                  'dsInstanceDn'    : server1.getRootDn() ,
                  'dsInstancePswd'  : server1.getRootPwd() ,
                  'dsInstanceHost'  : masterHost,
                  'dsInstancePort'  : master.getPort() ,
                  'dsInstanceDn'    : master.getRootDn() ,
                  'dsInstancePswd'  : master.getRootPwd() ,
                  'entryToBeAdded'  : '%s/replication_add_single.ldif' % clientDataDir }
              </call>
              <call function="'ldapModifyWithScript'">
                { 'location'          : clientHost,
                  'dsPath'            : clientPath,
                  'dsInstanceHost'    : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort() ,
                  'dsInstanceDn'      : server1.getRootDn() ,
                  'dsInstancePswd'    : server1.getRootPwd() ,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort() ,
                  'dsInstanceDn'      : master.getRootDn() ,
                  'dsInstancePswd'    : master.getRootPwd() ,
                  'dsFilename' : '%s/replication_mod.ldif' % clientDataDir }
              </call>
@@ -147,10 +158,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : entryDn,
                  'dsFilter'         :  '%s=%s' % (attr_type,attr_value) }                  
              </call>
@@ -168,7 +179,7 @@
                
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>                                                 
                
              <call function="'testCase_Postamble'"/>
@@ -198,10 +209,10 @@
              <call function="'DeleteEntry'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : entryDn }
              </call>
@@ -209,10 +220,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : entryDn,
                  'dsFilter'         : 'objectclass=*' ,
                  'expectedRC'  : 32 }                  
@@ -221,7 +232,7 @@
                
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>                                 
    
              <call function="'testCase_Postamble'"/>
@@ -250,10 +261,10 @@
              <call function="'DeleteEntry'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : synchroSuffix }
              </call>
@@ -261,10 +272,10 @@
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : server1.getHostname(),
                  'dsInstancePort' : server1.getPort(),
                  'dsInstanceDn'   : server1.getRootDn(),
                  'dsInstancePswd' : server1.getRootPwd(),
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/Example.ldif' % clientDataDir }
              </call>             
   
@@ -272,10 +283,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : 'uid=scarter,ou=People,%s' % synchroSuffix,
                  'dsFilter'         : 'objectclass=*' }                  
              </call>
@@ -283,7 +294,7 @@
                
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
                                      
              <call function="'testCase_Postamble'"/>
@@ -313,11 +324,11 @@
               <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort(),
                  'dsInstanceDn'    : server1.getRootDn(),
                  'dsInstancePswd'    : server1.getRootPwd(),
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'uid=tmorris, ou=People,%s' % synchroSuffix,
                  'attributeName' : 'description',
                  'newAttributeValue' : ' ',
@@ -328,10 +339,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : 'uid=tmorris, ou=People,%s' % synchroSuffix,
                  'dsFilter'         : 'description=*' }                  
              </call>
@@ -349,7 +360,7 @@
                
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
                                                                   
              <call function="'testCase_Postamble'"/>
@@ -379,11 +390,11 @@
              <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort(),
                  'dsInstanceDn'    : server1.getRootDn(),
                  'dsInstancePswd'    : server1.getRootPwd(),
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'uid=tmorris, ou=People,%s' % synchroSuffix,
                  'attributeName' : 'departmentnumber',
                  'newAttributeValue' : '5203214400',
@@ -394,10 +405,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : 'uid=tmorris, ou=People,%s' % synchroSuffix,
                  'dsFilter'         : 'departmentnumber=5203214400' }                  
              </call>
@@ -415,7 +426,7 @@
                                
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
              <call function="'testCase_Postamble'"/>
@@ -466,10 +477,10 @@
              <call function="'ldapModifyWithScript'">
                { 'location'          : clientHost,
                  'dsPath'            : clientPath,
                  'dsInstanceHost'    : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort() ,
                  'dsInstanceDn'      : server1.getRootDn() ,
                  'dsInstancePswd'    : server1.getRootPwd() ,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort() ,
                  'dsInstanceDn'      : master.getRootDn() ,
                  'dsInstancePswd'    : master.getRootPwd() ,
                  'dsFilename' : '%s/%s' % (clientDataDir, filename) }
              </call>        
                                
@@ -477,10 +488,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : 'uid=smason, ou=People,%s' % synchroSuffix,
                  'dsFilter'         : 'roomNumber=*',
                  'expectedRC'  : 0 }                  
@@ -499,7 +510,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
              <call function="'testCase_Postamble'"/>
@@ -527,11 +538,11 @@
              <!-- Modify "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort(),
                  'dsInstanceDn'    : server1.getRootDn(),
                  'dsInstancePswd'    : server1.getRootPwd(),
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'uid=jwalker, ou=People,%s' % synchroSuffix,
                  'attributeName' : 'roomNumber',
                  'newAttributeValue' : '3915',
@@ -542,10 +553,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'         : 'uid=jwalker, ou=People,%s' % synchroSuffix,
                  'dsFilter'         : 'roomNumber=3915' ,
                  'expectedRC'  : 0 }                  
@@ -564,7 +575,7 @@
                    
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
              <call function="'testCase_Postamble'"/>
@@ -601,11 +612,11 @@
              <!-- Modify "master" server -->                               
              <call function="'modifyAnAttribute'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'  : server1.getHostname() ,
                  'dsInstancePort'  : server1.getPort(),
                  'dsInstanceDn'  : server1.getRootDn(),
                  'dsInstancePswd'  : server1.getRootPwd(),
                { 'dsPath' : masterPath,
                  'dsInstanceHost'  : masterHost ,
                  'dsInstancePort'  : master.getPort(),
                  'dsInstanceDn'  : master.getRootDn(),
                  'dsInstancePswd'  : master.getRootPwd(),
                  'DNToModify'  : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'listAttributes'  : valuesToAdd,
                  'changetype'  : 'add' }
@@ -615,10 +626,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : '&amp;(postaladdress=Residence Parc Europe)(postaladdress=Appartement #6)(postaladdress=31 Rue General Mangin)(postaladdress=38100 Grenoble)' }                  
              </call>
@@ -636,7 +647,7 @@
                
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
               
              <call function="'testCase_Postamble'"/>
@@ -672,11 +683,11 @@
              <!-- Modify "master" server -->                
              <call function="'modifyAnAttribute'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort(),
                  'dsInstanceDn'    : server1.getRootDn(),
                  'dsInstancePswd'    : server1.getRootPwd(),
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'listAttributes' : valuesToDelete,
                  'changetype' : 'delete' }
@@ -686,10 +697,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : '|(postaladdress=Appartement #6)(postaladdress=38100 Grenoble)',
                  'expectedRC'  : 0 }                  
@@ -708,7 +719,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
                                
              <call function="'testCase_Postamble'"/>
@@ -746,11 +757,11 @@
              <!-- Modify "master" server -->                
              <call function="'modifyAnAttribute'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort(),
                  'dsInstanceDn'    : server1.getRootDn(),
                  'dsInstancePswd'    : server1.getRootPwd(),
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'listAttributes' : valuesToReplace,
                  'changetype' : 'replace' }
@@ -760,10 +771,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : '&amp;(postaladdress=Residence Letilleuil)(postaladdress=18 rue Nicolas Chorier)',
                  'expectedRC'  : 0 }                  
@@ -782,7 +793,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
                                
              <call function="'testCase_Postamble'"/>
@@ -818,11 +829,11 @@
              <!-- Modify "master" server -->                
              <call function="'modifyAnAttribute'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort(),
                  'dsInstanceDn'    : server1.getRootDn(),
                  'dsInstancePswd'    : server1.getRootPwd(),
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'listAttributes' : valuesToAdd,
                  'changetype' : 'add' }
@@ -832,10 +843,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'postaladdress=38000 Grenoble',
                  'expectedRC'  : 0 }                  
@@ -854,7 +865,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
                                
              <call function="'testCase_Postamble'"/>
@@ -890,11 +901,11 @@
              <!-- Modify "master" server -->                
              <call function="'modifyAnAttribute'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort(),
                  'dsInstanceDn'    : server1.getRootDn(),
                  'dsInstancePswd'    : server1.getRootPwd(),
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'listAttributes' : valuesToDelete,
                  'changetype' : 'delete' }
@@ -904,10 +915,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'postaladdress=Residence Letilleuil',
                  'expectedRC'  : 0 }                  
@@ -926,7 +937,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
                                
              <call function="'testCase_Postamble'"/>
@@ -953,48 +964,29 @@
                 'Replication: Basic: Modify Entry - replace case sensitive attribute. Check that case sensitive attribute modifications are replicated.'
              </message>
              <script>
                entryAttributes = []
                entryAttributes.append('cn: Tom Fitter')
                entryAttributes.append('sn: Fitter')
                entryAttributes.append('givenname: Tom')
                entryAttributes.append('objectclass: top')
                entryAttributes.append('objectclass: person')
                entryAttributes.append('objectclass: organizationalPerson')
                entryAttributes.append('objectclass: inetOrgPerson')
                entryAttributes.append('ou: Accounting')
                entryAttributes.append('ou: People')
                entryAttributes.append('l: Sunnyvale')
                entryAttributes.append('uid: tfitter')
                entryAttributes.append('mail: tfitter@example.com')
                entryAttributes.append('telephonenumber: +1 804  555 8974')
                entryAttributes.append('facsimiletelephonenumber: +1 804 555 1579')
                entryAttributes.append('roomnumber: 2164')
                entryAttributes.append('userpassword: hamstring')
                entryAttributes.append('description: PROFESSION Tap Fitter and PLUMBER')
              <!-- Modify "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' % clientDataDir }
              </call>
              <script>
                valuesToReplace = []
                valuesToReplace.append('description: Profession Tap Fitter and Plumber')
              </script>
                
              <!-- Modify "master" server -->
              <call function="'addAnEntry'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort(),
                  'dsInstanceDn'    : server1.getRootDn(),
                  'dsInstancePswd'    : server1.getRootPwd(),
                  'DNToAdd'   : 'uid=tfitter, ou=People,%s' % synchroSuffix,
                  'listAttributes' : entryAttributes }
              </call>
              <call function="'modifyAnAttribute'">
                { 'dsPath' : server1Path,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort(),
                  'dsInstanceDn'    : server1.getRootDn(),
                  'dsInstancePswd'    : server1.getRootPwd(),
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'uid=tfitter, ou=People,%s' % synchroSuffix,
                  'listAttributes' : valuesToReplace,
                  'changetype' : 'replace' }
@@ -1004,10 +996,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=tfitter, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'description=Profession Tap Fitter and Plumber',
                  'expectedRC'  : 0 }                  
@@ -1026,7 +1018,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call> 
                                
              <call function="'testCase_Postamble'"/>
@@ -1077,10 +1069,10 @@
              <call function="'ldapModifyWithScript'">
                { 'location'          : clientHost,
                  'dsPath'            : clientPath,
                  'dsInstanceHost'    : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort() ,
                  'dsInstanceDn'      : server1.getRootDn() ,
                  'dsInstancePswd'    : server1.getRootPwd() ,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort() ,
                  'dsInstanceDn'      : master.getRootDn() ,
                  'dsInstancePswd'    : master.getRootPwd() ,
                  'dsFilename' : '%s/%s' % (clientDataDir, filename) }
              </call>                            
                
@@ -1089,10 +1081,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=hmiller, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'jpegPhoto=*',
                  'expectedRC'  :  0 }                  
@@ -1111,7 +1103,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>               
                                                                                    
              <call function="'testCase_Postamble'"/>
@@ -1162,10 +1154,10 @@
              <call function="'ldapModifyWithScript'">
                { 'location'          : clientHost,
                  'dsPath'            : clientPath,
                  'dsInstanceHost'    : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort() ,
                  'dsInstanceDn'      : server1.getRootDn() ,
                  'dsInstancePswd'    : server1.getRootPwd() ,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort() ,
                  'dsInstanceDn'      : master.getRootDn() ,
                  'dsInstancePswd'    : master.getRootPwd() ,
                  'dsFilename' : '%s/%s' % (clientDataDir, filename) }
              </call>                            
                
@@ -1174,10 +1166,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=hmiller, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'jpegPhoto=*',
                  'expectedRC'  :  0 }                  
@@ -1196,7 +1188,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>               
                                                                                    
              <call function="'testCase_Postamble'"/>
@@ -1248,10 +1240,10 @@
              <call function="'ldapModifyWithScript'">
                { 'location'          : clientHost,
                  'dsPath'            : clientPath,
                  'dsInstanceHost'    : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort() ,
                  'dsInstanceDn'      : server1.getRootDn() ,
                  'dsInstancePswd'    : server1.getRootPwd() ,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort() ,
                  'dsInstanceDn'      : master.getRootDn() ,
                  'dsInstancePswd'    : master.getRootPwd() ,
                  'dsFilename' : '%s/%s' % (clientDataDir, filename) }
              </call>        
                
@@ -1259,10 +1251,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=hmiller, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'jpegPhoto=*',
                  'expectedRC'  :  0 }                  
@@ -1281,7 +1273,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>               
                                                                                    
              <call function="'testCase_Postamble'"/>
@@ -1332,10 +1324,10 @@
              <call function="'ldapModifyWithScript'">
                { 'location'          : clientHost,
                  'dsPath'            : clientPath,
                  'dsInstanceHost'    : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort() ,
                  'dsInstanceDn'      : server1.getRootDn() ,
                  'dsInstancePswd'    : server1.getRootPwd() ,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort() ,
                  'dsInstanceDn'      : master.getRootDn() ,
                  'dsInstancePswd'    : master.getRootPwd() ,
                  'dsFilename' : '%s/%s' % (clientDataDir, filename) }
              </call>                            
                
@@ -1345,10 +1337,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=kvaughan, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'objectclass=*',
                  'expectedRC'  : 32 }                  
@@ -1358,10 +1350,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=kvaughan2, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'objectclass=*' }                  
              </call>
@@ -1369,7 +1361,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>               
                                                                                    
              <call function="'testCase_Postamble'"/>
@@ -1421,10 +1413,10 @@
              <call function="'ldapModifyWithScript'">
                { 'location'          : clientHost,
                  'dsPath'            : clientPath,
                  'dsInstanceHost'    : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort() ,
                  'dsInstanceDn'      : server1.getRootDn() ,
                  'dsInstancePswd'    : server1.getRootPwd() ,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort() ,
                  'dsInstanceDn'      : master.getRootDn() ,
                  'dsInstancePswd'    : master.getRootPwd() ,
                  'dsFilename' : '%s/%s' % (clientDataDir, filename) }
              </call>                            
                
@@ -1434,10 +1426,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=jwallace, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'objectclass=*',
                  'expectedRC'  : 32 }                  
@@ -1447,10 +1439,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=igueye, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'uid=jwallace' }                  
              </call>
@@ -1468,7 +1460,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>               
                                                                                    
              <call function="'testCase_Postamble'"/>
@@ -1520,10 +1512,10 @@
              <call function="'ldapModifyWithScript'">
                { 'location'          : clientHost,
                  'dsPath'            : clientPath,
                  'dsInstanceHost'    : server1.getHostname() ,
                  'dsInstancePort'    : server1.getPort() ,
                  'dsInstanceDn'      : server1.getRootDn() ,
                  'dsInstancePswd'    : server1.getRootPwd() ,
                  'dsInstanceHost'    : masterHost ,
                  'dsInstancePort'    : master.getPort() ,
                  'dsInstanceDn'      : master.getRootDn() ,
                  'dsInstancePswd'    : master.getRootPwd() ,
                  'dsFilename' : '%s/%s' % (clientDataDir, filename) }
              </call>                            
                
@@ -1533,10 +1525,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=gfarmer, ou=People,%s' % synchroSuffix,
                  'dsFilter'  : 'objectclass=*',
                  'expectedRC'  : 32 }                  
@@ -1546,10 +1538,10 @@
              <call function="'ldapSearchWithScript'">
                { 'location'         : clientHost,
                  'dsPath'           : clientPath,
                  'dsInstanceHost'   : server1.getHostname() ,
                  'dsInstancePort'   : server1.getPort() ,
                  'dsInstanceDn'     : server1.getRootDn() ,
                  'dsInstancePswd'   : server1.getRootPwd() ,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'   : master.getPort() ,
                  'dsInstanceDn'     : master.getRootDn() ,
                  'dsInstancePswd'   : master.getRootPwd() ,
                  'dsBaseDN'    : 'uid=gfarmer, ou=Special People, ou=Special Users,%s' % synchroSuffix,
                  'dsFilter'  : 'objectclass=*' }                  
              </call>
@@ -1557,7 +1549,7 @@
              <!-- Verify the synchronization of the trees among the servers in the topology -->            
              <call function="'verifyTrees'">
                [ clientHost, clientPath, server1, [server2], synchroSuffix ]
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>               
                                                                                    
opends/tests/functional-tests/testcases/replication/basic/replication_basic_setup.xml
@@ -39,8 +39,7 @@
      </message>                
    
      <script>
        server1Path = '%s/%s' % (server1.getDir(),OPENDSNAME)
        synchroSuffix = server1.getSynchronizedSuffixList()[0].getSuffixDn()
        synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
        entryDn = 'uid=scarter,%s' % synchroSuffix
        grandchildEntryDn = 'uid=scarter,ou=People,o=replication tests,%s' % synchroSuffix
        mod_type = 'replace'
opends/tests/functional-tests/testcases/replication/replication.xml
@@ -44,15 +44,31 @@
          </script>
      
          <call function="'testGroup_Preamble'"/>
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/totalupdate/totalupdate.xml' % (TESTS_DIR)"/>
          <call function="'main_totalupdate'" />
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/binarycopy/replication_binarycopy.xml' % (TESTS_DIR)"/>
          <call function="'replication_binarycopy'" />
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/ldifimport/replication_ldifimport.xml' % (TESTS_DIR)"/>
          <call function="'replication_ldifimport'" />
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/resynchronization/replication_resynchronization.xml' % (TESTS_DIR)"/>
          <call function="'replication_resynchronization'" />
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/basic/replication_basic.xml' % (TESTS_DIR)"/>
          <call function="'replication_basic'" />          
                                          
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/schema/replication_schema.xml' % (TESTS_DIR)"/>
          <call function="'replication_schema'" />
          <call function="'testGroup_Postamble'"/>
                            
        </sequence>
opends/tests/functional-tests/testcases/replication/replication_cleanup.xml
@@ -37,34 +37,12 @@
        <sequence>                          
                            
          <!-- Stop the servers in the topology -->
          <iterate var="server" in="_topologyServerList">
            <sequence>
              <message>
                 'Stop DS on host %s running on port %s' % (server.getHostname(),server.getPort())
              </message>
              <!--- Stop DS -->
              <call function="'StopDsWithScript'">
                { 'location'  : server.getHostname(),
                  'dsHost' : server.getHostname(),
                  'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
                  'dsPort'    : server.getPort(),
                  'dsBindDN'  : server.getRootDn(),
                  'dsBindPwd' : server.getRootPwd() }
              </call>
              <call function="'checkRC'">
                { 'returncode' : RC ,
                  'result'     : STAXResult }
              </call>
            </sequence>
        </iterate>
          <!-- Stop the servers in the topology -->
          <call function="'stopServers'">
            [_topologyServerList]
          </call>
  
        <!-- Remove  the topology created for the test suite -->
          <!-- Remove  the topology created for the test suite -->
          <message>
            'Remove DS topology created for the Synchronization Basic Test Suite'
          </message>                  
opends/tests/functional-tests/testcases/replication/replication_setup.xml
@@ -68,45 +68,20 @@
             
            server1 = _topologyServerList[0]
            server2 = _topologyServerList[1]          
            master = _topologyServerList[0]
            masterHost = master.getHostname()
            masterPath = '%s/%s' % (master.getDir(),OPENDSNAME)
            masterDataDir = '%s/%s' % (master.getDir(),relativeDataDir)
            consumerList = _topologyServerList[1:]
          </script>        
                          
          <!-- Start the servers in the topology -->              
          <iterate var="server" in="_topologyServerList">
            <sequence>
              <message>
                'Start DS on host  %s to run on port %s' % (server.getHostname(),server.getPort())
              </message>
              <!--- Start DS -->
              <call function="'StartDsWithScript'">
                { 'location'  : server.getHostname(),
                  'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME) }
              </call>
              <call function="'checkRC'">
                { 'returncode' : RC ,
                  'result'     : STAXResult }
              </call>
            </sequence>
          </iterate>
          <!-- Check that the servers in the topology started -->
          <iterate var="server" in="_topologyServerList">
            <!--- Check that DS started -->
            <call function="'isAlive'">
              { 'location' : server.getHostname(),
                'dsPath' : '%s/%s' % (server.getDir(),OPENDSNAME),
                'dsInstanceHost' : server.getHostname(),
                'dsInstancePort' : server.getPort(),
                'dsInstanceDn' : server.getRootDn(),
                'dsInstancePswd' : server.getRootPwd(),
                'noOfLoops' : 5 ,
                'noOfMilliSeconds' : 2000 }
            </call>
          </iterate>
          <call function="'startServers'">
            [_topologyServerList]
          </call>
        </sequence>
      </block>
opends/tests/functional-tests/testcases/replication/totalupdate/replication_binarycopy.xml
New file
@@ -0,0 +1,302 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_binarycopy"/>
  <function name="replication_binarycopy">
    <sequence>
      <block name="'binarycopy'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <!--- Test Suite information
          #@TestSuiteName       Replication Binary Copy Tests
          #@TestSuitePurpose    Verify that the servers in a replicated topology can be initialised by the means of a binary copy (backup-restore).
          #@TestSuiteID         Binary Copy Tests
          #@TestSuiteGroup      Binary Copy
          #@TestGroup           Replication
          #@TestScript          replication_binarycopy.xml
          #@TestHTMLLink        http://opends.dev.java.net/
          -->
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'" />
          <script>
            synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
          </script>
          <!--- Test Case information
          #@TestMarker          Replication Binary Copy Tests
          #@TestName            Replication: Binary Copy: Off-line initialisation
          #@TestID                  Off-line initialisation
          #@TestPurpose         Initialise replicated servers using off-line backup/restore
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="'Replication: Binary Copy: Off-line initialisation'">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Binary Copy: Off-line initialisation. Initialise replicated servers using off-line backup/restore'
              </message>
              <!-- Stop the servers in the topology -->
              <call function="'stopServers'">
                [_topologyServerList]
              </call>
              <!-- Import data into "master" server -->
              <call function="'ImportLdifWithScript'">
                { 'location'     : masterHost,
                  'dsPath'       : masterPath,
                  'dsLdifFile'   : '%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(),
                  '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'] }
              </call>
              <!-- Backup "master" server -->
              <call function="'backup'">
                { 'location'  :  masterHost,
                  'dsPath'  :  masterPath,
                  'backupDir'  :  '%s/replication/master_backup' % masterDataDir }
              </call>
              <!-- Copy backup to "consumer" servers and restore it -->
              <paralleliterate var="consumer" in="consumerList">
                <sequence>
                  <call function="'CopyFolderByExtension'">
                    { 'location'   :  masterHost,
                      'remotehost'  :  consumer.getHostname(),
                      'srcfolder'  :  '%s/replication/master_backup' % masterDataDir,
                      'destfolder' :  '%s/%s/replication/master_backup' % (consumer.getDir(),relativeDataDir),
                      'extension'  : '*' }
                  </call>
                  <call function="'restore'">
                    { 'location'  :  consumer.getHostname(),
                      'dsPath'  :  '%s/%s' % (consumer.getDir(), OPENDSNAME),
                      'backupDir'  :  '%s/%s/replication/master_backup' % (consumer.getDir(),relativeDataDir) }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Start the servers in the topology -->
              <call function="'startServers'">
                [_topologyServerList]
              </call>
              <!-- Add entry to "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' % clientDataDir }
              </call>
              <!-- Verify the synchronization of the trees among the servers in the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Binary Copy Tests
          #@TestName            Replication: Binary Copy: On-line initialisation
          #@TestID                  On-line initialisation
          #@TestPurpose         Initialise replicated servers using on-line backup/restore
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="'Replication: Binary Copy: On-line initialisation'">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Binary Copy: On-line initialisation. Initialise replicated servers using on-line backup/restore'
              </message>
              <!-- Clean the servers in the topology
              <call function="'deleteTrees'">
                [_topologyServerList, synchroSuffix, False]
              </call> -->
              <!-- Delete manually added entry so that replication server won't add it automatically later on -->
              <call function="'ldapDeleteWithScript'">
                { 'location'  :  clientHost,
                  'dsPath'  :  clientPath,
                  'dsInstanceHost'  :  master.getHostname(),
                  'dsInstancePort'  :  master.getPort(),
                  'dsInstanceDn'  : master.getRootDn(),
                  'dsInstancePswd' :  master.getRootPwd(),
                  'dsDn'  :  ['uid=tfitter, ou=People,%s' % synchroSuffix] }
              </call>
              <!-- Import data into "master" server -->
              <call function="'importLdifTask'">
                { 'location'  :  clientHost,
                  'dsPath'  :  clientPath,
                  'dsInstanceHost'  : masterHost,
                  'dsInstancePort'  :  master.getPort(),
                  'dsInstanceDn'  :  master.getRootDn(),
                  'dsInstancePswd'  :  master.getRootPwd(),
                  'taskID'  :  'import task',
                  '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(),
                  '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 -->
              <call function="'backupTask'">
                { 'location'  :  clientHost,
                  'dsPath'  :  clientPath,
                  'dsInstanceHost'  : masterHost,
                  'dsInstancePort'  :  master.getPort(),
                  'dsInstanceDn'  :  master.getRootDn(),
                  'dsInstancePswd'  :  master.getRootPwd(),
                  'taskID'  :  'backup task',
                  'backupDir'  :  '%s/replication/master_backup_online' % masterDataDir }
              </call>
              <!-- Copy backup to "consumer" servers and restore it -->
              <paralleliterate var="consumer" in="consumerList">
                <sequence>
                  <call function="'CopyFolderByExtension'">
                    { 'location'   :  masterHost,
                      'remotehost'  :  consumer.getHostname(),
                      'srcfolder'  :  '%s/replication/master_backup_online' % masterDataDir,
                      'destfolder' :  '%s/%s/replication/master_backup_online' % (consumer.getDir(),relativeDataDir),
                      'extension'  : '*' }
                  </call>
                  <call function="'restoreTask'">
                    { 'location'  :  clientHost,
                      'dsPath'  :  clientPath,
                      'dsInstanceHost'  :  consumer.getHostname(),
                      'dsInstancePort'  : consumer.getPort(),
                      'dsInstanceDn'  :  consumer.getRootDn(),
                      'dsInstancePswd'  :  consumer.getRootPwd(),
                      'taskID'  :  'restore task',
                      'backupDir'  :  '%s/%s/replication/master_backup_online' % (consumer.getDir(),relativeDataDir) }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Add entry to "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' % clientDataDir }
              </call>
              <!-- Verify the synchronization of the trees among the servers in the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" />
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/functional-tests/testcases/replication/totalupdate/replication_ldifimport.xml
New file
@@ -0,0 +1,300 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_ldifimport"/>
  <function name="replication_ldifimport">
    <sequence>
      <block name="'ldifimport'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <!--- Test Suite information
          #@TestSuiteName       Replication Ldif Import Tests
          #@TestSuitePurpose    Verify that the servers in a replicated topology can be initialised by the means of an ldif import.
          #@TestSuiteID         Ldif Import Tests
          #@TestSuiteGroup      Ldif Import
          #@TestGroup           Replication
          #@TestScript          replication_ldifimport.xml
          #@TestHTMLLink        http://opends.dev.java.net/
          -->
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'" />
          <script>
            synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
          </script>
          <!--- Test Case information
          #@TestMarker          Replication Ldif Import Tests
          #@TestName            Replication: Ldif Import: Off-line initialisation
          #@TestID                  Off-line initialisation
          #@TestPurpose         Initialise replicated servers using off-line export/import
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="'Replication: Ldif Import: Off-line initialisation'">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Ldif Import: Off-line initialisation. Initialise replicated servers using off-line export/import'
              </message>
              <!-- Stop the servers in the topology -->
              <call function="'stopServers'">
                [_topologyServerList]
              </call>
              <!-- Import data into "master" server -->
              <call function="'ImportLdifWithScript'">
                { 'location'     : masterHost,
                  'dsPath'       : masterPath,
                  'dsLdifFile'   : '%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(),
                  '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'] }
              </call>
              <!-- Export data from  "master" server -->
              <call function="'exportLdif'">
                { 'location'  :  masterHost,
                  'dsPath'  :  masterPath,
                  'ldifFile'  :  '%s/replication/master_export.ldif' % masterDataDir }
              </call>
              <!-- Copy export file  to "consumer" servers and import it -->
              <paralleliterate var="consumer" in="consumerList">
                <sequence>
                  <call function="'copyFile'">
                    { 'location'   :  masterHost,
                      'remotehost'  :  consumer.getHostname(),
                      'srcfile'  :  '%s/replication/master_export.ldif' % masterDataDir,
                      'destfile' :  '%s/%s/replication/master_export.ldif' % (consumer.getDir(),relativeDataDir) }
                  </call>
                  <call function="'ImportLdifWithScript'">
                    { 'location'  : consumer.getHostname(),
                      'dsPath'  :  '%s/%s' % (consumer.getDir(), OPENDSNAME),
                      'dsLdifFile'   :  '%s/%s/replication/master_export.ldif' % (consumer.getDir(),relativeDataDir) }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Start the servers in the topology -->
              <call function="'startServers'">
                [_topologyServerList]
              </call>
              <!-- Add entry to "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' % clientDataDir }
              </call>
              <!-- Verify the synchronization of the trees among the servers in the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Ldif Import Tests
          #@TestName            Replication: Ldif Import: On-line initialisation
          #@TestID                  On-line initialisation
          #@TestPurpose         Initialise replicated servers using on-line export/import
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="'Replication: Ldif Import: On-line initialisation'">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Ldif Import: On-line initialisation. Initialise replicated servers using on-line export/import'
              </message>
              <!-- Clean the servers in the topology
              <call function="'deleteTrees'">
                [_topologyServerList, synchroSuffix, False]
              </call> -->
              <!-- Delete manually added entry so that replication server won't add it automatically later on -->
              <call function="'ldapDeleteWithScript'">
                { 'location'  :  clientHost,
                  'dsPath'  :  clientPath,
                  'dsInstanceHost'  :  master.getHostname(),
                  'dsInstancePort'  :  master.getPort(),
                  'dsInstanceDn'  : master.getRootDn(),
                  'dsInstancePswd' :  master.getRootPwd(),
                  'dsDn'  :  ['uid=tfitter, ou=People,%s' % synchroSuffix] }
              </call>
              <!-- Import data into "master" server -->
              <call function="'importLdifTask'">
                { 'location'  :  clientHost,
                  'dsPath'  :  clientPath,
                  'dsInstanceHost'  : masterHost,
                  'dsInstancePort'  :  master.getPort(),
                  'dsInstanceDn'  :  master.getRootDn(),
                  'dsInstancePswd'  :  master.getRootPwd(),
                  'taskID'  :  'import task',
                  '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(),
                  '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>
              <!-- Export data from  "master" server -->
              <call function="'exportLdifTask'">
                { 'location'  :  masterHost,
                  'dsPath'  :  masterPath,
                  'dsInstanceHost'  : masterHost,
                  'dsInstancePort'  :  master.getPort(),
                  'dsInstanceDn'  :  master.getRootDn(),
                  'dsInstancePswd'  :  master.getRootPwd(),
                  'taskID'  :  'export task',
                  'ldifFile'  :  '%s/replication/master_export_online.ldif' % masterDataDir }
              </call>
              <!-- Copy export file  to "consumer" servers and import it -->
              <paralleliterate var="consumer" in="consumerList">
                <sequence>
                  <call function="'copyFile'">
                    { 'location'   :  masterHost,
                      'remotehost'  :  consumer.getHostname(),
                      'srcfile'  :  '%s/replication/master_export_online.ldif' % masterDataDir,
                      'destfile' :  '%s/%s/replication/master_export_online.ldif' % (consumer.getDir(),relativeDataDir) }
                  </call>
                  <call function="'importLdifTask'">
                    { 'location'  :  clientHost,
                      'dsPath'  :  clientPath,
                      'dsInstanceHost'  : consumer.getHostname(),
                      'dsInstancePort'  :  consumer.getPort(),
                      'dsInstanceDn'  :  consumer.getRootDn(),
                      'dsInstancePswd'  :  consumer.getRootPwd(),
                      'taskID'  :  'import task',
                      'ldifFile'  :  '%s/%s/replication/master_export_online.ldif' % (consumer.getDir(),relativeDataDir) }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Add entry to "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' % clientDataDir }
              </call>
              <!-- Verify the synchronization of the trees among the servers in the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" />
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/functional-tests/testcases/replication/totalupdate/replication_resynchronization.xml
New file
@@ -0,0 +1,316 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_resynchronization"/>
  <function name="replication_resynchronization">
    <sequence>
      <block name="'resynchronization'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <!--- Test Suite information
          #@TestSuiteName       Replication Re-Synchronization Tests
          #@TestSuitePurpose    Verify that the servers in a replicated topology can be initialised with an old backup and still re-synchronize.
          #@TestSuiteID         Re-Synchronization Tests
          #@TestSuiteGroup      Re-Synchronization
          #@TestGroup           Replication
          #@TestScript          replication_resynchronization.xml
          #@TestHTMLLink        http://opends.dev.java.net/
          -->
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'" />
          <script>
            synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
          </script>
          <!--- Test Case information
          #@TestMarker          Replication Re-Synchronization Tests
          #@TestName            Replication: Re-Synchronization: Off-line initialisation
          #@TestID                  Off-line initialisation
          #@TestPurpose         Initialise replicated servers using off-line backup/restore
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="'Replication: Re-Synchronization: Off-line initialisation'">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Re-Synchronization: Off-line initialisation. Initialise replicated servers using off-line backup/restore'
              </message>
              <!-- Stop the servers in the topology -->
              <call function="'stopServers'">
                [_topologyServerList]
              </call>
              <!-- Import data into "master" server -->
              <call function="'ImportLdifWithScript'">
                { 'location'     : masterHost,
                  'dsPath'       : masterPath,
                  'dsLdifFile'   : '%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(),
                  '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'] }
              </call>
              <!-- Backup "master" server -->
              <call function="'backup'">
                { 'location'  :  masterHost,
                  'dsPath'  :  masterPath,
                  'backupDir'  :  '%s/replication/master_backup' % masterDataDir }
              </call>
              <!-- Start the "master" server -->
              <call function="'StartDsWithScript'">
                { 'location'  :  masterHost,
                  'dsPath'  :  masterPath }
              </call>
              <!-- Add entry to "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' % clientDataDir }
              </call>
              <!-- Copy backup to "consumer" servers and restore it -->
              <paralleliterate var="consumer" in="consumerList">
                <sequence>
                  <call function="'CopyFolderByExtension'">
                    { 'location'   :  masterHost,
                      'remotehost'  :  consumer.getHostname(),
                      'srcfolder'  :  '%s/replication/master_backup' % masterDataDir,
                      'destfolder' :  '%s/%s/replication/master_backup' % (consumer.getDir(),relativeDataDir),
                      'extension'  : '*' }
                  </call>
                  <call function="'restore'">
                    { 'location'  :  consumer.getHostname(),
                      'dsPath'  :  '%s/%s' % (consumer.getDir(), OPENDSNAME),
                      'backupDir'  :  '%s/%s/replication/master_backup' % (consumer.getDir(),relativeDataDir) }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Start the "consumer" servers -->
              <call function="'startServers'">
                [consumerList]
              </call>
              <!-- Verify the synchronization of the trees among the servers in the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Re-Synchronization Tests
          #@TestName            Replication: Re-Synchronization: On-line initialisation
          #@TestID                  On-line initialisation
          #@TestPurpose         Initialise replicated servers using on-line backup/restore
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="'Replication: Re-Synchronization: On-line initialisation'">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Re-Synchronization: On-line initialisation. Initialise replicated servers using on-line backup/restore'
              </message>
              <!-- Clean the servers in the topology
              <call function="'deleteTrees'">
                [_topologyServerList, synchroSuffix, False]
              </call> -->
              <!-- Delete manually added entry so that replication server won't add it automatically later on -->
              <call function="'ldapDeleteWithScript'">
                { 'location'  :  clientHost,
                  'dsPath'  :  clientPath,
                  'dsInstanceHost'  :  master.getHostname(),
                  'dsInstancePort'  :  master.getPort(),
                  'dsInstanceDn'  : master.getRootDn(),
                  'dsInstancePswd' :  master.getRootPwd(),
                  'dsDn'  :  ['uid=tfitter, ou=People,%s' % synchroSuffix] }
              </call>
              <!-- Import data into "master" server -->
              <call function="'importLdifTask'">
                { 'location'  :  clientHost,
                  'dsPath'  :  clientPath,
                  'dsInstanceHost'  : masterHost,
                  'dsInstancePort'  :  master.getPort(),
                  'dsInstanceDn'  :  master.getRootDn(),
                  'dsInstancePswd'  :  master.getRootPwd(),
                  'taskID'  :  'import task',
                  '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(),
                  '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 -->
              <call function="'backupTask'">
                { 'location'  :  clientHost,
                  'dsPath'  :  clientPath,
                  'dsInstanceHost'  : masterHost,
                  'dsInstancePort'  :  master.getPort(),
                  'dsInstanceDn'  :  master.getRootDn(),
                  'dsInstancePswd'  :  master.getRootPwd(),
                  'taskID'  :  'backup task',
                  'backupDir'  :  '%s/replication/master_backup_online' % masterDataDir }
              </call>
              <!-- Add entry to "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/tfitter.ldif' % clientDataDir }
              </call>
              <!-- Copy backup to "consumer" servers and restore it -->
              <paralleliterate var="consumer" in="consumerList">
                <sequence>
                  <call function="'CopyFolderByExtension'">
                    { 'location'   :  masterHost,
                      'remotehost'  :  consumer.getHostname(),
                      'srcfolder'  :  '%s/replication/master_backup_online' % masterDataDir,
                      'destfolder' :  '%s/%s/replication/master_backup_online' % (consumer.getDir(),relativeDataDir),
                      'extension'  : '*' }
                  </call>
                  <call function="'restoreTask'">
                    { 'location'  :  clientHost,
                      'dsPath'  :  clientPath,
                      'dsInstanceHost'  :  consumer.getHostname(),
                      'dsInstancePort'  : consumer.getPort(),
                      'dsInstanceDn'  :  consumer.getRootDn(),
                      'dsInstancePswd'  :  consumer.getRootPwd(),
                      'taskID'  :  'restore task',
                      'backupDir'  :  '%s/%s/replication/master_backup_online' % (consumer.getDir(),relativeDataDir) }
                  </call>
                </sequence>
              </paralleliterate>
              <!-- Verify the synchronization of the trees among the servers in the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" />
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/functional-tests/testcases/replication/totalupdate/replication_schema.xml
New file
@@ -0,0 +1,313 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="replication_schema"/>
  <function name="replication_schema">
    <sequence>
      <block name="'schema'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
          <call function="'testSuite_Preamble'"/>
          <!--- Test Suite information
          #@TestSuiteName       Replication Schema Replication Tests
          #@TestSuitePurpose    Verify that the schema is replicated as any other suffix in a replicated topology.
          #@TestSuiteID         Schema Replication Tests
          #@TestSuiteGroup      Schema Replication
          #@TestGroup           Replication
          #@TestScript          replication_schema.xml
          #@TestHTMLLink        http://opends.dev.java.net/
          -->
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/replication_setup.xml' % (TESTS_DIR)"/>
          <call function="'replication_setup'" />
          <script>
            synchroSuffix = master.getSynchronizedSuffixList()[0].getSuffixDn()
            replServerList = master.getSynchronizedSuffixList()[0].getChangelogServerList()
          </script>
          <iterate var="server" in="_topologyServerList" indexvar="i">
            <sequence>
              <message>
                'Create domain name for schema on server %s/%s' % (server.getDir(), OPENDSNAME)
              </message>
              <call function="'createMultimasterDomain'">
                { 'location' : server.getHostname(),
                  'dsPath' :  '%s/%s' % (server.getDir(), OPENDSNAME),
                  'dsInstanceHost'  : server.getHostname(),
                  'dsInstancePort'   : server.getPort(),
                  'dsInstanceDn'    : server.getRootDn(),
                  'dsInstancePswd'  : server.getRootPwd(),
                  'domainName'  : 'schema',
                  'replicationDn'  : 'cn=schema',
                  'serverId'  :  i + 1,
                  'replicationServerList'  :  replServerList }
              </call>
            </sequence>
          </iterate>
          <!--- Test Case information
          #@TestMarker          Replication Schema Replication Tests
          #@TestName            Replication: Schema Replication: Add objectclass
          #@TestID                  Add objectclass
          #@TestPurpose        Check schema replication when a new objectclass is added
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="'Replication: Schema Replication: Add objectclass'">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Schema Replication: Add objectclass. Check schema replication when a new objectclass is added'
              </message>
              <!-- Load entries into "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/Example.ldif' % clientDataDir }
              </call>
              <script>
                newObjectclass = '( testobjectclass-oid NAME \'testobjectclass-0\'  SUP person MAY ( street $  c ) X-ORIGIN \'user defined\' )'
              </script>
              <!-- Modify schema  in "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'cn=schema',
                  'attributeName' : 'objectClasses',
                  'newAttributeValue' : newObjectclass,
                  'changetype' : 'add' }
              </call>
              <!-- Add entry to "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/testuser-0.ldif' % clientDataDir }
              </call>
              <!-- Verify the synchronization of the schema among the servers in the topology -->
              <call function="'verifySchemas'">
                [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
              </call>
              <!-- Verify the synchronization of the trees among the servers in the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Schema Replication Tests
          #@TestName            Replication: Schema Replication: Add attributetype
          #@TestID                  Add attributetype
          #@TestPurpose        Check schema replication when a new attributetype is added
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          -->
          <testcase name="'Replication: Schema Replication: Add attributetype'">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Schema Replication: Add attributetype Check schema replication when a new attributetype is added'
              </message>
              <script>
                newObjectclass = '( testobjectclass1-oid NAME \'testobjectclass-1\'  SUP person MAY ( street $ testattribute-1 $  c ) X-ORIGIN \'user defined\' )'
                newAttributetype = '( testattribute1-oid NAME \'testattribute-1\' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN \'user defined\' )'
              </script>
              <!-- Modify schema  in "master" server -->
              <call function="'modifyAnAttribute'">
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'cn=schema',
                  'attributeName' : 'attributeTypes',
                  'newAttributeValue' : newAttributetype,
                  'changetype' : 'add' }
              </call>
              <call function="'modifyAnAttribute'">
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'cn=schema',
                  'attributeName' : 'objectClasses',
                  'newAttributeValue' : newObjectclass,
                  'changetype' : 'add' }
              </call>
              <!-- Add entry to "master" server -->
              <call function="'addEntry'">
                { 'location'       : clientHost,
                  'dsPath'         : clientPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                  'entryToBeAdded' : '%s/replication/testuser-1.ldif' % clientDataDir }
              </call>
              <!-- Verify the synchronization of the schema among the servers in the topology -->
              <call function="'verifySchemas'">
                [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
              </call>
              <!-- Verify the synchronization of the trees among the servers in the topology -->
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          Replication Schema Replication Tests
          #@TestName            Replication: Schema Replication: Delete objectclass
          #@TestID                  Delete objectclass
          #@TestPurpose        Check schema replication when an objectclass is deleted
          #@TestPreamble
          #@TestSteps
          #@TestPostamble
          #@TestResult
          <testcase name="'Replication: Schema Replication: Delete objectclass'">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                 'Replication: Schema Replication: Delete objectclass Check schema replication when an objectclass is deleted'
              </message>
              <script>
                newObjectclass = '( testobjectclass-oid NAME \'testobjectclass-0\'  SUP person MAY ( street $  c ) X-ORIGIN \'user defined\' )'
              </script>
              <!-- Modify schema  in "master" server
              <call function="'modifyAnAttribute'">
                { 'dsPath' : masterPath,
                  'dsInstanceHost'   : masterHost ,
                  'dsInstancePort'    : master.getPort(),
                  'dsInstanceDn'    : master.getRootDn(),
                  'dsInstancePswd'    : master.getRootPwd(),
                  'DNToModify'    : 'cn=schema',
                  'attributeName' : 'objectClasses',
                  'newAttributeValue' : newObjectclass,
                  'changetype' : 'delete' }
              </call>
              <!-- Try to add entry to servers; should be rejected with error 65 (objectclass violation)
              <iterate var="server" in="_topologyServerList">
                <call function="'addEntry'">
                  { 'location'       : clientHost,
                    'dsPath'         : clientPath,
                    'dsInstanceHost' : server.getHostname(),
                    'dsInstancePort' : server.getPort(),
                    'dsInstanceDn'   : server.getRootDn(),
                    'dsInstancePswd' : server.getRootPwd(),
                    'entryToBeAdded' : '%s/replication/testuser-0.ldif' % clientDataDir,
                    'expectedRC' : 65 }
                </call>
              </iterate>
              <!-- Verify the synchronization of the schema among the servers in the topology
              <call function="'verifySchemas'">
                [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
              </call>
              <!-- Verify the synchronization of the trees among the servers in the topology
              <call function="'verifyTrees'">
                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
-->
          <import machine="'%s' % (STAF_LOCAL_HOSTNAME)"
            file="'%s/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" />
          <call function="'testSuite_Postamble'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml
@@ -137,12 +137,12 @@
              
              <!-- Verify the total update -->  
              <call function="'checkImport'">
                { 'location'  : server1.getHostname(),
                  'dsPath'    : '%s/%s' % (server1.getDir(),OPENDSNAME),
                  'dsHost'    : server1.getHostname(),
                  'dsPort'    : server1.getPort(),
                  'dsDn'      : server1.getRootDn(),
                  'dsPswd'    : server1.getRootPwd(),
                { 'location'  : server2.getHostname(),
                  'dsPath'    : '%s/%s' % (server2.getDir(),OPENDSNAME),
                  'dsHost'    : server2.getHostname(),
                  'dsPort'    : server2.getPort(),
                  'dsDn'      : server2.getRootDn(),
                  'dsPswd'    : server2.getRootPwd(),
                  'expectedEntries' : ['uid=scarter,ou=People,o=example',
                                       'uid=dmiller, ou=People, o=example',
                                       'uid=rhunt, ou=People, o=example'],