From 3b7e19e935b1aa6e565f324e7073f4b546c28d1f Mon Sep 17 00:00:00 2001
From: ludovicp <ludovicp@localhost>
Date: Mon, 07 Jun 2010 09:38:55 +0000
Subject: [PATCH] Improve External Changelog tests and tools

---
 opendj-sdk/opends/tests/staf-tests/shared/functions/ldap.xml                                                                       |   46 ++
 opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml |  716 +++++++++++++++++++++++++++++++-----------------------
 2 files changed, 452 insertions(+), 310 deletions(-)

diff --git a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml
index f50c0b8..56d55db 100644
--- a/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml
+++ b/opendj-sdk/opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml
@@ -7591,52 +7591,71 @@
               </script>
               <if expr="searchRC == 0">
                 <sequence>
-                <message>
-                  'This is the ECL entry as read from server %s:%s: \n%s' %\
-                  (replServer.getHostname(), replServer.getPort(), 
-                   searchResult)
-                </message>
-                  <call function="'parseLdifEntry'">
-                    { 'ldifEntry' : searchResult }
-                  </call>
-                  <script>
-                    eclEntry = STAXResult
-                    
-                    if ecl_mode == 'opends':
-                      nextIndex = eclEntry['changelogcookie'][0]
-                    else:
-                      nextChgNumber = int(eclEntry['changenumber'][0]) + 1
-                      nextIndex     = str(nextChgNumber)
-                  </script>
                   <message>
-                    'Parsed changelog entry:  \n%s' % eclEntry
+                    'This is the ECL entry as read from server %s:%s: \n%s' %\
+                    (replServer.getHostname(), replServer.getPort(), 
+                     searchResult)
                   </message>
-                  <message>
-                    'Index to use for the next ECL search:  %s' % \
-                    nextIndex
-                  </message>
-                      
-                  <if expr="addedEntry and eclEntry">
-                    <call function="'checkChangelogEntry'">
-                      { 'location'        : masterHost,
-                        'dsPath'          : masterPath,
-                        'changelogEntry'  : eclEntry,
-                        'targetDN'        : myTargetDN,
-                        'changeNumber'    : myChangeNumber,
-                        'changeType'      : myChangeType,
-                        'changeTime'      : myChangeTime,
-                        'targetEntryUUID' : myTargetEntryUUID,
-                        'changes'         : myChanges,
-                        'includeAttrs'    : myIncAttrs
-                      }
-                    </call>
+                  <if expr="len(searchResult) != 0">
+                    <sequence>
+                      <call function="'parseLdifEntry'">
+                        { 'ldifEntry' : searchResult }
+                      </call>
+                      <script>
+                        eclEntry = STAXResult
+                        
+                        if ecl_mode == 'opends':
+                          nextIndex = eclEntry['changelogcookie'][0]
+                        else:
+                          nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+                          nextIndex     = str(nextChgNumber)
+                      </script>
+                      <message>
+                        'Parsed changelog entry:  \n%s' % eclEntry
+                      </message>
+                      <message>
+                        'Index to use for the next ECL search:  %s' % \
+                        nextIndex
+                      </message>
+                          
+                      <if expr="addedEntry and eclEntry">
+                        <call function="'checkChangelogEntry'">
+                          { 'location'        : masterHost,
+                            'dsPath'          : masterPath,
+                            'changelogEntry'  : eclEntry,
+                            'targetDN'        : myTargetDN,
+                            'changeNumber'    : myChangeNumber,
+                            'changeType'      : myChangeType,
+                            'changeTime'      : myChangeTime,
+                            'targetEntryUUID' : myTargetEntryUUID,
+                            'changes'         : myChanges,
+                            'includeAttrs'    : myIncAttrs
+                          }
+                        </call>
+                        <else>
+                          <sequence>
+                            <message log="1" level="'Error'">
+                              'Unable to check external changelog entry \
+                              (failed to read LDAP and/or changelog entry)'
+                            </message>
+                            <call function="'testFailed'"/>
+                          </sequence>
+                        </else>
+                      </if>
+                  
+                    </sequence>
                     <else>
                       <sequence>
                         <message log="1" level="'Error'">
-                          'Unable to check external changelog entry \
-                          (failed to read LDAP and/or changelog entry)'
+                         'Expected some ECL entry but NO ENTRY returned'
                         </message>
-                        <call function="'testFailed'"/>
+                        <!-- We may have come across issue CR 6954670:
+                         !   ECL - draft: update ECL-disabled suffix, then
+                         !   non-disabled suffix, make lastChangenumber
+                         !   incoherent --> 
+                        <call function="'setKnownIssue'">
+                          { 'issueId' : 6954670 }
+                        </call>
                       </sequence>
                     </else>
                   </if>
@@ -7836,60 +7855,79 @@
               </script>
               <if expr="searchRC == 0">
                 <sequence>
-                <message>
-                  'This is the ECL entry as read from server %s:%s: \n%s' %\
-                  (replServer.getHostname(), replServer.getPort(), 
-                   searchResult)
-                </message>
-                  <call function="'parseLdifEntry'">
-                    { 'ldifEntry' : searchResult }
-                  </call>
-                  <script>
-                    eclEntry = STAXResult
-                    
-                    if ecl_mode == 'opends':
-                      nextIndex = eclEntry['changelogcookie'][0]
-                    else:
-                      nextChgNumber = int(eclEntry['changenumber'][0]) + 1
-                      nextIndex     = str(nextChgNumber)
-                  </script>
                   <message>
-                    'Parsed changelog entry:  \n%s' % eclEntry
+                    'This is the ECL entry as read from server %s:%s: \n%s' %\
+                    (replServer.getHostname(), replServer.getPort(), 
+                     searchResult)
                   </message>
-                  <message>
-                    'Index to use for the next ECL search:  %s' % \
-                    nextIndex
-                  </message>
-                   
-                  <!-- We may come across issue CR 6929416:
-                   !   ECL: updates done on server don't publish include-attrs
-                   !   configured on peer server -->   
-                  <if expr="addedEntry and eclEntry">
-                    <call function="'checkChangelogEntry'">
-                      { 'location'        : masterHost,
-                        'dsPath'          : masterPath,
-                        'changelogEntry'  : eclEntry,
-                        'targetDN'        : myTargetDN,
-                        'changeNumber'    : myChangeNumber,
-                        'changeType'      : myChangeType,
-                        'changeTime'      : myChangeTime,
-                        'targetEntryUUID' : myTargetEntryUUID,
-                        'changes'         : myChanges,
-                        'includeAttrs'    : myIncAttrs,
-                        'knownIssue'      : '6929416'
-                      }
-                    </call>
+                  <if expr="len(searchResult) != 0">
+                    <sequence>
+                      <call function="'parseLdifEntry'">
+                        { 'ldifEntry' : searchResult }
+                      </call>
+                      <script>
+                        eclEntry = STAXResult
+                        
+                        if ecl_mode == 'opends':
+                          nextIndex = eclEntry['changelogcookie'][0]
+                        else:
+                          nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+                          nextIndex     = str(nextChgNumber)
+                      </script>
+                      <message>
+                        'Parsed changelog entry:  \n%s' % eclEntry
+                      </message>
+                      <message>
+                        'Index to use for the next ECL search:  %s' % \
+                        nextIndex
+                      </message>
+                       
+                      <!-- We may come across issue CR 6929416:
+                       !   ECL: updates done on server don't publish include-attrs
+                       !   configured on peer server -->   
+                      <if expr="addedEntry and eclEntry">
+                        <call function="'checkChangelogEntry'">
+                          { 'location'        : masterHost,
+                            'dsPath'          : masterPath,
+                            'changelogEntry'  : eclEntry,
+                            'targetDN'        : myTargetDN,
+                            'changeNumber'    : myChangeNumber,
+                            'changeType'      : myChangeType,
+                            'changeTime'      : myChangeTime,
+                            'targetEntryUUID' : myTargetEntryUUID,
+                            'changes'         : myChanges,
+                            'includeAttrs'    : myIncAttrs,
+                            'knownIssue'      : '6929416'
+                          }
+                        </call>
+                        <else>
+                          <sequence>
+                            <message log="1" level="'Error'">
+                              'Unable to check external changelog entry \
+                              (failed to read LDAP and/or changelog entry)'
+                            </message>
+                            <call function="'testFailed'"/>
+                          </sequence>
+                        </else>
+                      </if>
+              
+                    </sequence>
                     <else>
                       <sequence>
                         <message log="1" level="'Error'">
-                          'Unable to check external changelog entry \
-                          (failed to read LDAP and/or changelog entry)'
+                         'Expected some ECL entry but NO ENTRY returned'
                         </message>
-                        <call function="'testFailed'"/>
+                        <!-- We may have come across issue CR 6954670:
+                         !   ECL - draft: update ECL-disabled suffix, then
+                         !   non-disabled suffix, make lastChangenumber
+                         !   incoherent --> 
+                        <call function="'setKnownIssue'">
+                          { 'issueId' : 6954670 }
+                        </call>
                       </sequence>
                     </else>
                   </if>
-              
+
                 </sequence>
                 <else>
                   <message log="1" level="'Error'">
@@ -8131,61 +8169,80 @@
               </script>
               <if expr="searchRC == 0">
                 <sequence>
-                <message>
-                  'This is the ECL entry as read from server %s:%s: \n%s' %\
-                  (replServer.getHostname(), replServer.getPort(), 
-                   searchResult)
-                </message>
-                  <call function="'parseLdifEntry'">
-                    { 'ldifEntry' : searchResult }
-                  </call>
-                  <script>
-                    eclEntry = STAXResult
-                    
-                    if ecl_mode == 'opends':
-                      nextIndex = eclEntry['changelogcookie'][0]
-                    else:
-                      nextChgNumber = int(eclEntry['changenumber'][0]) + 1
-                      nextIndex     = str(nextChgNumber)
-                  </script>
                   <message>
-                    'Parsed changelog entry:  \n%s' % eclEntry
+                    'This is the ECL entry as read from server %s:%s: \n%s' %\
+                    (replServer.getHostname(), replServer.getPort(), 
+                     searchResult)
                   </message>
-                  <message>
-                    'Index to use for the next ECL search:  %s' % \
-                    nextIndex
-                  </message>
-                      
-                  <!-- We may come across issue CR 6932197:
-                   !   ECL: old ecl-include attributes still published in 
-                   !   change entries until server restart -->
-                  <if expr="addedEntry and eclEntry">
-                    <call function="'checkChangelogEntry'">
-                      { 'location'        : masterHost,
-                        'dsPath'          : masterPath,
-                        'changelogEntry'  : eclEntry,
-                        'targetDN'        : myTargetDN,
-                        'changeNumber'    : myChangeNumber,
-                        'changeType'      : myChangeType,
-                        'changeTime'      : myChangeTime,
-                        'targetEntryUUID' : myTargetEntryUUID,
-                        'changes'         : myChanges,
-                        'includeAttrs'    : myIncAttrs,
-                        'expectMissingIncAttrs' : myMissingIncAttrs,
-                        'knownIssue'      : '6932197'
-                      }
-                    </call>
+                  <if expr="len(searchResult) != 0">
+                    <sequence>
+                      <call function="'parseLdifEntry'">
+                        { 'ldifEntry' : searchResult }
+                      </call>
+                      <script>
+                        eclEntry = STAXResult
+                        
+                        if ecl_mode == 'opends':
+                          nextIndex = eclEntry['changelogcookie'][0]
+                        else:
+                          nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+                          nextIndex     = str(nextChgNumber)
+                      </script>
+                      <message>
+                        'Parsed changelog entry:  \n%s' % eclEntry
+                      </message>
+                      <message>
+                        'Index to use for the next ECL search:  %s' % \
+                        nextIndex
+                      </message>
+                          
+                      <!-- We may come across issue CR 6932197:
+                       !   ECL: old ecl-include attributes still published in 
+                       !   change entries until server restart -->
+                      <if expr="addedEntry and eclEntry">
+                        <call function="'checkChangelogEntry'">
+                          { 'location'        : masterHost,
+                            'dsPath'          : masterPath,
+                            'changelogEntry'  : eclEntry,
+                            'targetDN'        : myTargetDN,
+                            'changeNumber'    : myChangeNumber,
+                            'changeType'      : myChangeType,
+                            'changeTime'      : myChangeTime,
+                            'targetEntryUUID' : myTargetEntryUUID,
+                            'changes'         : myChanges,
+                            'includeAttrs'    : myIncAttrs,
+                            'expectMissingIncAttrs' : myMissingIncAttrs,
+                            'knownIssue'      : '6932197'
+                          }
+                        </call>
+                        <else>
+                          <sequence>
+                            <message log="1" level="'Error'">
+                              'Unable to check external changelog entry \
+                              (failed to read LDAP and/or changelog entry)'
+                            </message>
+                            <call function="'testFailed'"/>
+                          </sequence>
+                        </else>
+                      </if>
+              
+                    </sequence>
                     <else>
                       <sequence>
                         <message log="1" level="'Error'">
-                          'Unable to check external changelog entry \
-                          (failed to read LDAP and/or changelog entry)'
+                         'Expected some ECL entry but NO ENTRY returned'
                         </message>
-                        <call function="'testFailed'"/>
+                        <!-- We may have come across issue CR 6954670:
+                         !   ECL - draft: update ECL-disabled suffix, then
+                         !   non-disabled suffix, make lastChangenumber
+                         !   incoherent --> 
+                        <call function="'setKnownIssue'">
+                          { 'issueId' : 6954670 }
+                        </call>
                       </sequence>
                     </else>
                   </if>
-              
+
                 </sequence>
                 <else>
                   <message log="1" level="'Error'">
@@ -8422,56 +8479,75 @@
               </script>
               <if expr="searchRC == 0">
                 <sequence>
-                <message>
-                  'This is the ECL entry as read from server %s:%s: \n%s' %\
-                  (replServer.getHostname(), replServer.getPort(), 
-                   searchResult)
-                </message>
-                  <call function="'parseLdifEntry'">
-                    { 'ldifEntry' : searchResult }
-                  </call>
-                  <script>
-                    eclEntry = STAXResult
-                    
-                    if ecl_mode == 'opends':
-                      nextIndex = eclEntry['changelogcookie'][0]
-                    else:
-                      nextChgNumber = int(eclEntry['changenumber'][0]) + 1
-                      nextIndex     = str(nextChgNumber)
-                  </script>
                   <message>
-                    'Parsed changelog entry:  \n%s' % eclEntry
+                    'This is the ECL entry as read from server %s:%s: \n%s' %\
+                    (replServer.getHostname(), replServer.getPort(), 
+                     searchResult)
                   </message>
-                  <message>
-                    'Index to use for the next ECL search:  %s' % \
-                    nextIndex
-                  </message>
-                      
-                  <if expr="addedEntry and eclEntry">
-                    <call function="'checkChangelogEntry'">
-                      { 'location'        : masterHost,
-                        'dsPath'          : masterPath,
-                        'changelogEntry'  : eclEntry,
-                        'targetDN'        : myTargetDN,
-                        'changeNumber'    : myChangeNumber,
-                        'changeType'      : myChangeType,
-                        'changeTime'      : myChangeTime,
-                        'targetEntryUUID' : myTargetEntryUUID,
-                        'changes'         : myChanges,
-                        'includeAttrs'    : myIncAttrs
-                      }
-                    </call>
+                  <if expr="len(searchResult) != 0">
+                    <sequence>
+                      <call function="'parseLdifEntry'">
+                        { 'ldifEntry' : searchResult }
+                      </call>
+                      <script>
+                        eclEntry = STAXResult
+                        
+                        if ecl_mode == 'opends':
+                          nextIndex = eclEntry['changelogcookie'][0]
+                        else:
+                          nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+                          nextIndex     = str(nextChgNumber)
+                      </script>
+                      <message>
+                        'Parsed changelog entry:  \n%s' % eclEntry
+                      </message>
+                      <message>
+                        'Index to use for the next ECL search:  %s' % \
+                        nextIndex
+                      </message>
+                          
+                      <if expr="addedEntry and eclEntry">
+                        <call function="'checkChangelogEntry'">
+                          { 'location'        : masterHost,
+                            'dsPath'          : masterPath,
+                            'changelogEntry'  : eclEntry,
+                            'targetDN'        : myTargetDN,
+                            'changeNumber'    : myChangeNumber,
+                            'changeType'      : myChangeType,
+                            'changeTime'      : myChangeTime,
+                            'targetEntryUUID' : myTargetEntryUUID,
+                            'changes'         : myChanges,
+                            'includeAttrs'    : myIncAttrs
+                          }
+                        </call>
+                        <else>
+                          <sequence>
+                            <message log="1" level="'Error'">
+                              'Unable to check external changelog entry \
+                              (failed to read LDAP and/or changelog entry)'
+                            </message>
+                            <call function="'testFailed'"/>
+                          </sequence>
+                        </else>
+                      </if>
+              
+                    </sequence>
                     <else>
                       <sequence>
                         <message log="1" level="'Error'">
-                          'Unable to check external changelog entry \
-                          (failed to read LDAP and/or changelog entry)'
+                         'Expected some ECL entry but NO ENTRY returned'
                         </message>
-                        <call function="'testFailed'"/>
+                        <!-- We may have come across issue CR 6954670:
+                         !   ECL - draft: update ECL-disabled suffix, then
+                         !   non-disabled suffix, make lastChangenumber
+                         !   incoherent --> 
+                        <call function="'setKnownIssue'">
+                          { 'issueId' : 6954670 }
+                        </call>
                       </sequence>
                     </else>
                   </if>
-              
+
                 </sequence>
                 <else>
                   <message log="1" level="'Error'">
@@ -8681,57 +8757,76 @@
               </script>
               <if expr="searchRC == 0">
                 <sequence>
-                <message>
-                  'This is the ECL entry as read from server %s:%s: \n%s' %\
-                  (replServer.getHostname(), replServer.getPort(), 
-                   searchResult)
-                </message>
-                  <call function="'parseLdifEntry'">
-                    { 'ldifEntry' : searchResult }
-                  </call>
-                  <script>
-                    eclEntry = STAXResult
-                    
-                    if ecl_mode == 'opends':
-                      nextIndex = eclEntry['changelogcookie'][0]
-                    else:
-                      nextChgNumber = int(eclEntry['changenumber'][0]) + 1
-                      nextIndex     = str(nextChgNumber)
-                  </script>
                   <message>
-                    'Parsed changelog entry:  \n%s' % eclEntry
+                    'This is the ECL entry as read from server %s:%s: \n%s' %\
+                    (replServer.getHostname(), replServer.getPort(), 
+                     searchResult)
                   </message>
-                  <message>
-                    'Index to use for the next ECL search:  %s' % \
-                    nextIndex
-                  </message>
+                  <if expr="len(searchResult) != 0">
+                    <sequence>
+                      <call function="'parseLdifEntry'">
+                        { 'ldifEntry' : searchResult }
+                      </call>
+                      <script>
+                        eclEntry = STAXResult
+                        
+                        if ecl_mode == 'opends':
+                          nextIndex = eclEntry['changelogcookie'][0]
+                        else:
+                          nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+                          nextIndex     = str(nextChgNumber)
+                      </script>
+                      <message>
+                        'Parsed changelog entry:  \n%s' % eclEntry
+                      </message>
+                      <message>
+                        'Index to use for the next ECL search:  %s' % \
+                        nextIndex
+                      </message>
+                          
+                      <if expr="addedEntry and eclEntry">
+                        <call function="'checkChangelogEntry'">
+                          { 'location'        : masterHost,
+                            'dsPath'          : masterPath,
+                            'changelogEntry'  : eclEntry,
+                            'targetDN'        : myTargetDN,
+                            'changeNumber'    : myChangeNumber,
+                            'changeType'      : myChangeType,
+                            'changeTime'      : myChangeTime,
+                            'targetEntryUUID' : myTargetEntryUUID,
+                            'changes'         : myChanges,
+                            'includeAttrs'    : myIncAttrs,
+                            'expectMissingIncAttrs' : myMissingIncAttrs,
+                          }
+                        </call>
+                        <else>
+                          <sequence>
+                            <message log="1" level="'Error'">
+                              'Unable to check external changelog entry \
+                              (failed to read LDAP and/or changelog entry)'
+                            </message>
+                            <call function="'testFailed'"/>
+                          </sequence>
+                        </else>
+                      </if>
                       
-                  <if expr="addedEntry and eclEntry">
-                    <call function="'checkChangelogEntry'">
-                      { 'location'        : masterHost,
-                        'dsPath'          : masterPath,
-                        'changelogEntry'  : eclEntry,
-                        'targetDN'        : myTargetDN,
-                        'changeNumber'    : myChangeNumber,
-                        'changeType'      : myChangeType,
-                        'changeTime'      : myChangeTime,
-                        'targetEntryUUID' : myTargetEntryUUID,
-                        'changes'         : myChanges,
-                        'includeAttrs'    : myIncAttrs,
-                        'expectMissingIncAttrs' : myMissingIncAttrs,
-                      }
-                    </call>
+                    </sequence>
                     <else>
                       <sequence>
                         <message log="1" level="'Error'">
-                          'Unable to check external changelog entry \
-                          (failed to read LDAP and/or changelog entry)'
+                         'Expected some ECL entry but NO ENTRY returned'
                         </message>
-                        <call function="'testFailed'"/>
+                        <!-- We may have come across issue CR 6954670:
+                         !   ECL - draft: update ECL-disabled suffix, then
+                         !   non-disabled suffix, make lastChangenumber
+                         !   incoherent --> 
+                        <call function="'setKnownIssue'">
+                          { 'issueId' : 6954670 }
+                        </call>
                       </sequence>
                     </else>
                   </if>
-              
+
                 </sequence>
                 <else>
                   <message log="1" level="'Error'">
@@ -8983,100 +9078,119 @@
                     % (replServer.getHostname(), replServer.getPort(), 
                        searchResult)
                   </message>
-                  <call function="'parseLdifEntries'">
-                    { 'ldifEntries' : searchResult }
-                  </call>
-                  <script>
-                    eclEntries = STAXResult
-                  </script>
-                  
-                  <if expr="len(addedEntries) != len(eclEntries)">
+                  <if expr="len(searchResult) != 0">
                     <sequence>
-                      <message log="1" level="'Error'">
-                       'Number of added entries %s does not match number of ECL \
-                       entries %s' % (len(addedEntries), len(eclEntries))
-                      </message>
-                    <call function="'testFailed'"/>
-                    </sequence>
-                  </if>
-                  
-                  <iterate var="eclEntry"
-                           in="eclEntries"
-                           indexvar="i">
-                    <sequence>
-                    
+                      <call function="'parseLdifEntries'">
+                        { 'ldifEntries' : searchResult }
+                      </call>
                       <script>
-                        if ecl_mode == 'opends':
-                          nextIndex     = eclEntry['changelogcookie'][0]
-                        else:
-                          nextChgNumber = int(eclEntry['changenumber'][0]) + 1
-                          nextIndex     = str(nextChgNumber)
-                          
-                        addedEntry             = addedEntries[i]
-                        myTargetDN             = addedEntry['dn'][0]
-                        myChangeType           = 'add'
-                        myChangeTime           = addedEntry['createtimestamp'][0]
-                        myTargetEntryUUID      = addedEntry['entryuuid'][0]
-                        # myReplicationCSN     = ----> grab from where???
-                        # myReplicatIdentifier = ----> grab from ldap server
-                        myChanges              = {}
-                        myIncAttrs             = {}
-                        
-                        for attr in addedEntry.keys():
-                          if (attr != 'dn') and (attr != 'changelogcookie') :
-                            myChanges[attr] = addedEntry[attr]
-                        
-                        for incAttr in incAttrs:
-                          if incAttr in addedEntry.keys():
-                            myIncAttrs[incAttr] = addedEntry[incAttr]
-                          else:
-                            myIncAttrs[incAttr] = ' '
-                        
-                        if ecl_mode != 'opends':
-                          myIntChangeNumber    = int(searchIndex) + i
-                          myChangeNumber       = str(myIntChangeNumber)
-                        else:
-                          myChangeNumber       = None
+                        eclEntries = STAXResult
                       </script>
-                      <message>
-                        'Parsed changelog entry:  \n%s' % eclEntry
-                      </message>
-                      <message>
-                        'Index to use for the next ECL search:  %s' % nextIndex
-                      </message>
-    
-                      <!-- We may come across issue CR 6929416:
-                       !   ECL: updates done on server don't publish
-                       !   include-attrs configured on peer server -->
-                      <if expr="addedEntry and eclEntry">
-                        <call function="'checkChangelogEntry'">
-                          { 'location'        : masterHost,
-                            'dsPath'          : masterPath,
-                            'changelogEntry'  : eclEntry,
-                            'targetDN'        : myTargetDN,
-                            'changeNumber'    : myChangeNumber,
-                            'changeType'      : myChangeType,
-                            'changeTime'      : myChangeTime,
-                            'targetEntryUUID' : myTargetEntryUUID,
-                            'changes'         : myChanges,
-                            'includeAttrs'    : myIncAttrs,
-                            'knownIssue'      : '6929416'
-                          }
-                        </call>
-                        <else>
-                          <sequence>
-                            <message log="1" level="'Error'">
-                              'Unable to check external changelog entry \
-                              (failed to read LDAP and/or changelog entry)'
-                            </message>
-                            <call function="'testFailed'"/>
-                          </sequence>
-                        </else>
+                      
+                      <if expr="len(addedEntries) != len(eclEntries)">
+                        <sequence>
+                          <message log="1" level="'Error'">
+                           'Number of added entries %s does not match number of ECL \
+                           entries %s' % (len(addedEntries), len(eclEntries))
+                          </message>
+                        <call function="'testFailed'"/>
+                        </sequence>
                       </if>
                       
-                    </sequence>
-                  </iterate>
+                      <iterate var="eclEntry"
+                               in="eclEntries"
+                               indexvar="i">
+                        <sequence>
+                        
+                          <script>
+                            if ecl_mode == 'opends':
+                              nextIndex     = eclEntry['changelogcookie'][0]
+                            else:
+                              nextChgNumber = int(eclEntry['changenumber'][0]) + 1
+                              nextIndex     = str(nextChgNumber)
+                              
+                            addedEntry             = addedEntries[i]
+                            myTargetDN             = addedEntry['dn'][0]
+                            myChangeType           = 'add'
+                            myChangeTime           = addedEntry['createtimestamp'][0]
+                            myTargetEntryUUID      = addedEntry['entryuuid'][0]
+                            # myReplicationCSN     = ----> grab from where???
+                            # myReplicatIdentifier = ----> grab from ldap server
+                            myChanges              = {}
+                            myIncAttrs             = {}
+                            
+                            for attr in addedEntry.keys():
+                              if (attr != 'dn') and (attr != 'changelogcookie') :
+                                myChanges[attr] = addedEntry[attr]
+                            
+                            for incAttr in incAttrs:
+                              if incAttr in addedEntry.keys():
+                                myIncAttrs[incAttr] = addedEntry[incAttr]
+                              else:
+                                myIncAttrs[incAttr] = ' '
+                            
+                            if ecl_mode != 'opends':
+                              myIntChangeNumber    = int(searchIndex) + i
+                              myChangeNumber       = str(myIntChangeNumber)
+                            else:
+                              myChangeNumber       = None
+                          </script>
+                          <message>
+                            'Parsed changelog entry:  \n%s' % eclEntry
+                          </message>
+                          <message>
+                            'Index to use for the next ECL search:  %s' % nextIndex
+                          </message>
+        
+                          <!-- We may come across issue CR 6929416:
+                           !   ECL: updates done on server don't publish
+                           !   include-attrs configured on peer server -->
+                          <if expr="addedEntry and eclEntry">
+                            <call function="'checkChangelogEntry'">
+                              { 'location'        : masterHost,
+                                'dsPath'          : masterPath,
+                                'changelogEntry'  : eclEntry,
+                                'targetDN'        : myTargetDN,
+                                'changeNumber'    : myChangeNumber,
+                                'changeType'      : myChangeType,
+                                'changeTime'      : myChangeTime,
+                                'targetEntryUUID' : myTargetEntryUUID,
+                                'changes'         : myChanges,
+                                'includeAttrs'    : myIncAttrs,
+                                'knownIssue'      : '6929416'
+                              }
+                            </call>
+                            <else>
+                              <sequence>
+                                <message log="1" level="'Error'">
+                                  'Unable to check external changelog entry \
+                                  (failed to read LDAP and/or changelog entry)'
+                                </message>
+                                <call function="'testFailed'"/>
+                              </sequence>
+                            </else>
+                          </if>
+                          
+                        </sequence>
+                      </iterate>
                   
+                    </sequence>
+                    <else>
+                      <sequence>
+                        <message log="1" level="'Error'">
+                         'Expected some ECL entry but NO ENTRY returned'
+                        </message>
+                        <!-- We may have come across issue CR 6954670:
+                         !   ECL - draft: update ECL-disabled suffix, then
+                         !   non-disabled suffix, make lastChangenumber
+                         !   incoherent --> 
+                        <call function="'setKnownIssue'">
+                          { 'issueId' : 6954670 }
+                        </call>
+                      </sequence>
+                    </else>
+                  </if>
+
                 </sequence>
                 <else>
                   <message log="1" level="'Error'">
diff --git a/opendj-sdk/opends/tests/staf-tests/shared/functions/ldap.xml b/opendj-sdk/opends/tests/staf-tests/shared/functions/ldap.xml
index fa397e5..6536cf0 100755
--- a/opendj-sdk/opends/tests/staf-tests/shared/functions/ldap.xml
+++ b/opendj-sdk/opends/tests/staf-tests/shared/functions/ldap.xml
@@ -3589,15 +3589,43 @@
         '%s %s' % (STAFCmd, STAFCmdParams)
       </message>
       
-      <call function="'runCommand'">
-        { 'command'   : STAFCmd,
-          'arguments' : STAFCmdParams,
-          'location'  : location,
-          'name'      : 'ldapsearch',
-          'expectedRC': expectedRC,
-          'knownIssue': knownIssue
-        }
-      </call>
+      <!-- Give the changes time to propagate in the ECL -->
+      <script>
+        myCounter = 1
+        taskRC    = 1
+        noOfLoops = 10
+      </script>
+      <loop from="1" to="noOfLoops" while="taskRC != 0">
+        <sequence>
+        
+          <message>
+            'LOOP number %s - %s %s' % (myCounter, STAFCmd, STAFCmdParams)
+          </message>
+    
+          <call function="'runCommand'">
+            { 'command'   : STAFCmd,
+              'arguments' : STAFCmdParams,
+              'location'  : location,
+              'name'      : 'ldapsearch',
+              'expectedRC': expectedRC,
+              'knownIssue': knownIssue
+            }
+          </call>
+          <script>
+            STAFCmdRC     = RC
+            STAFCmdResult = STAXResult
+            myCounter     = myCounter + 1
+          </script>
+          
+          <if expr='STAFCmdResult[0][1] != None and len(STAFCmdResult[0][1].strip()) > 0'>
+            <sequence>
+              <script>taskRC = 0</script>
+              <return>STAFCmdResult</return>
+            </sequence>
+          </if>
+        </sequence>
+      </loop>
+      
       <return>
         STAXResult
       </return>

--
Gitblit v1.10.0