From b25da32e939089eb8108c4d7394b3f7d64232827 Mon Sep 17 00:00:00 2001
From: ugaston <ugaston@localhost>
Date: Wed, 18 Mar 2009 16:53:08 +0000
Subject: [PATCH] Improve knownIssue handling in some replication and sasl testcases

---
 opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml        |   14 
 opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml    |    9 
 opends/tests/staf-tests/functional-tests/testcases/security/sasl/security_sasl_digest-md5.xml | 1021 ++++++++++++++++++++++++---------------------------
 opends/tests/staf-tests/shared/functions/tools.xml                                            |   22 
 opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml              |   22 
 opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml      |   55 +
 opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml      |    8 
 7 files changed, 564 insertions(+), 587 deletions(-)

diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml
index 92bc116..6e4abd5 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/changelog/changelog.xml
@@ -1315,16 +1315,21 @@
                       # => expect NO entry returned
                       # => len(searchResult) = 0 => resultLength = 0
                       myExpectedRC = 0
+                      # if entry not purged => we may have run into Issue 3736
+                      # (Dynamic purge delay change not taken into account)
+                      myKnownIssue = '3736'
                     else:
                       # purge delay not expired (default purge delay: 1 day)
                       # => expect entry returned
                       # => len(searchResult) > 0 => resultLength = 1
                       myExpectedRC = 1
+                      myKnownIssue = None
                   </script>
                   <call function="'checktestRC'">
                     { 'returncode' : resultLength ,
                       'result'     : searchResult ,
-                      'expected'   : myExpectedRC
+                      'expected'   : myExpectedRC,
+                      'issue'      : myKnownIssue
                     }
                   </call>                                           
                                
@@ -1332,16 +1337,11 @@
               </paralleliterate>
                                                 
               <!-- Verify the synchronization of the trees among the servers in
-                the topology -->          
+                the topology -->
               <call function="'verifyTrees'">
                 [ clientHost, clientPath, master, consumerList, synchroSuffix ]
               </call>
 
-              <!-- #3736: Dynamic purge delay change not properly taken into 
-                   account -->
-              <call function="'setKnownIssue'">
-                { 'issueId' : '3736' }
-              </call>
              
               <call function="'testCase_Postamble'"/>
             </sequence>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml
index bae786c..4e9ef44 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/encryption/encryption.xml
@@ -97,6 +97,16 @@
                   <script>
                     serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                     userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
+                    
+                    if i == 0:
+                      myKnownIssue = None
+                    else:
+                      # if we fail to add the entry to the 'consumer' servers
+                      # => it may mean that the initialize-all is not completely
+                      # done yet, and so we may have come across Issue 3315
+                      # (dsreplication initialize-all returns before peer 
+                      # has completed initialisation)
+                      myKnownIssue = '3315'
                   </script>
                     
                   <!-- Add entry to one of the other servers -->
@@ -121,7 +131,8 @@
                       'dsInstancePswd' : server.getRootPwd(),
                       'DNToAdd'        : userDn,
                       'listAttributes' : listAttr,
-                      'expectedRC'     : 0
+                      'expectedRC'     : 0,
+                      'knownIssue'     : myKnownIssue
                     }
                   </call>
               
@@ -134,11 +145,6 @@
                 [ clientHost, clientPath, master, consumerList, synchroSuffix ]
               </call> 
 
-              <!-- #3315: dsreplication initialize-all returns before peer has
-                   completed initialisation -->
-              <call function="'setKnownIssue'">
-                { 'issueId' : '3315' }
-              </call>
 
               <call function="'testCase_Postamble'"/>
             </sequence>
@@ -169,6 +175,16 @@
                   <script>
                     serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                     userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
+                    
+                    if i == 0:
+                      myKnownIssue = None
+                    else:
+                      # if we fail to modify the entry in the 'consumer' servers
+                      # => it may mean that the initialize-all is not completely
+                      # done yet, and so we may have come across Issue 3315
+                      # (dsreplication initialize-all returns before peer 
+                      # has completed initialisation)
+                      myKnownIssue = '3315'                    
                   </script>
                                     
                   <!-- Modify entry on one of the servers -->
@@ -182,7 +198,8 @@
                       'DNToModify'        : userDn,
                       'attributeName'     : 'l',
                       'newAttributeValue' : 'GEC',
-                      'changetype'        : 'replace'
+                      'changetype'        : 'replace',
+                      'knownIssue'        : myKnownIssue
                     }
                   </call>                       
                 </sequence>
@@ -194,12 +211,6 @@
                 [ clientHost, clientPath, master, consumerList, synchroSuffix ]
               </call> 
 
-              <!-- #3315: dsreplication initialize-all returns before peer has
-                   completed initialisation -->
-              <call function="'setKnownIssue'">
-                { 'issueId' : '3315' }
-              </call>
-
               <call function="'testCase_Postamble'"/>
             </sequence>
           </testcase>                     
@@ -229,6 +240,16 @@
                   <script>
                     serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                     userDn = 'uid=iabizen-%s, ou=People, %s' % (i,synchroSuffix)
+                    
+                    if i == 0:
+                      myKnownIssue = None
+                    else:
+                      # if we fail to delete the entry to the 'consumer' servers
+                      # => it may mean that the initialize-all is not completely
+                      # done yet, and so we may have come across Issue 3315
+                      # (dsreplication initialize-all returns before peer 
+                      # has completed initialisation)
+                      myKnownIssue = '3315'                    
                   </script>
                     
                   <!-- Delete entry on one of the servers -->    
@@ -239,7 +260,8 @@
                       'dsInstancePort' : server.getPort() ,
                       'dsInstanceDn'   : server.getRootDn() ,
                       'dsInstancePswd' : server.getRootPwd() ,
-                      'dsBaseDN'       : userDn
+                      'dsBaseDN'       : userDn,
+                      'knownIssue'     : myKnownIssue
                     }
                   </call>
                 </sequence>
@@ -251,11 +273,6 @@
                 [ clientHost, clientPath, master, consumerList, synchroSuffix ]
               </call>
 
-              <!-- #3315: dsreplication initialize-all returns before peer has
-                   completed initialisation -->
-              <call function="'setKnownIssue'">
-                { 'issueId' : '3315' }
-              </call>
          
               <call function="'testCase_Postamble'"/>
             </sequence>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml
index 700ba3f..401e12a 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/ldifimport/ldifimport.xml
@@ -225,13 +225,13 @@
                 
               <!-- Verify the synchronization of the trees among the servers in
                 the topology -->
+              <!-- If the trees differ, it could be due to Issue 3122
+                (Off-line import-export sequence produces no generationID) -->
               <call function="'verifyTrees'">
-                [ clientHost, clientPath, master, consumerList, synchroSuffix ]
+                [ clientHost, clientPath, master, consumerList, synchroSuffix,
+                  '3122' ]
               </call> 
 
-              <call function="'setKnownIssue'">
-                { 'issueId' : '3122' }
-              </call>
 
               <call function="'testCase_Postamble'"/>
             </sequence>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml
index 89abb62..c2861f7 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/schema/schema.xml
@@ -689,6 +689,8 @@
                                 
               <!-- Try to add entry to servers; should be rejected with error 65
                 (objectclass violation) -->
+              <!-- If the add doesn't return 65, it may mean we came across
+                issue 2355 (Manual schema objectclass delete not replicated) -->
               <iterate var="server" in="_topologyServerList">
                 <call function="'addEntry'">
                   { 'location'       : clientHost,
@@ -699,7 +701,8 @@
                     'dsInstancePswd' : server.getRootPwd(),
                     'entryToBeAdded' : '%s/replication/newtestuser-0.ldif' % \
                                        clientDataDir,
-                    'expectedRC'     : 65
+                    'expectedRC'     : 65,
+                    'knownIssue'     : '2355'
                   }
                 </call>                             
               </iterate> 
@@ -716,9 +719,6 @@
                 [ clientHost, clientPath, master, consumerList, synchroSuffix ]
               </call> 
 
-              <call function="'setKnownIssue'">
-                { 'issueId' : '2355' }
-              </call>
 
               <call function="'testCase_Postamble'"/>
             </sequence>
@@ -792,6 +792,8 @@
                                                                                                                                 
               <!-- Try to add entry to servers; should be rejected with error 65
                 (objectclass violation) -->
+              <!-- If the add doesn't return 65, it may mean we came across
+                issue 2355 (Manual schema objectclass delete not replicated) -->
               <iterate var="server" in="_topologyServerList">
                 <call function="'addEntry'">
                   { 'location'       : clientHost,
@@ -802,15 +804,20 @@
                     'dsInstancePswd' : server.getRootPwd(),
                     'entryToBeAdded' : '%s/replication/newtestuser-2.ldif' % \
                                        clientDataDir,
-                    'expectedRC'     : 65
+                    'expectedRC'     : 65,
+                    'knownIssue'     : '2355'
                   }
                 </call>                             
               </iterate> 
                        
               <!-- Verify the synchronization of the schema among the servers in
                 the topology -->
+              <!-- Since this testcase inherits the 99-user.ldif from the one
+                before, as long as 2355 is still present, the schema files will
+                differ as the second server will still have newobjectclass-0 -->
               <call function="'verifySchemas'">
-                [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
+                [ clientHost, clientPath, master, consumerList, '99-user.ldif',
+                  '2355' ]
               </call> 
                 
               <!-- Verify the synchronization of the trees among the servers in
@@ -819,9 +826,6 @@
                 [ clientHost, clientPath, master, consumerList, synchroSuffix ]
               </call> 
 
-              <call function="'setKnownIssue'">
-                { 'issueId' : '2355' }
-              </call>
 
               <call function="'testCase_Postamble'"/>
             </sequence>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml b/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml
index f3da29d..a33f114 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/replication/totalupdate/totalupdate.xml
@@ -345,8 +345,12 @@
 
               <!-- Verify the synchronization of the schema among the servers
                 in the topology -->
+              <!-- If the schema files differ, it could be due to Issue 2599
+                (Replication adds modifiersName and modifyTimestamp to schema 
+                updates) -->
               <call function="'verifySchemas'">
-                [ clientHost, clientPath, master, consumerList, '99-user.ldif' ]
+                [ clientHost, clientPath, master, consumerList, '99-user.ldif',
+                  '2599' ]
               </call> 
                                                 
               <!-- Verify the synchronization of the trees among the servers in
@@ -355,9 +359,6 @@
                 [ clientHost, clientPath, master, consumerList, 'o=example' ]
               </call>                
 
-              <call function="'setKnownIssue'">
-                { 'issueId' : '2599' }
-              </call>
               
               <call function="'testCase_Postamble'"/>
             </sequence>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/security/sasl/security_sasl_digest-md5.xml b/opends/tests/staf-tests/functional-tests/testcases/security/sasl/security_sasl_digest-md5.xml
index e9c431f..b103ec9 100755
--- a/opends/tests/staf-tests/functional-tests/testcases/security/sasl/security_sasl_digest-md5.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/security/sasl/security_sasl_digest-md5.xml
@@ -908,14 +908,12 @@
                  returnString = STAXResult[0][1]
             </script> 
     
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
                'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal sasl, simple authentication'
@@ -934,14 +932,12 @@
                  returnString = STAXResult[0][1]
             </script> 
     
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
                'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal sasl, delete global search ACI'
@@ -975,17 +971,15 @@
                  returnString = STAXResult[0][1]
             </script> 
     
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal sasl, simple authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal sasl, simple authentication'
             </message>
 
             <call function="'SearchObject'">
@@ -994,43 +988,43 @@
                 'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
                 'dsInstancePswd'   : 'frogleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+                'dsFilter'         : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
     
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal sasl, adding authmethod ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal sasl, adding authmethod ACI'
             </message>
 
             <script>
-                    curr_aci="(targetattr=\"*\")(version 3.0; acl \"aci1\"; allow (read,search,compare) authmethod=\"sasl DIGEST-MD5\";)"
+              curr_aci="(targetattr=\"*\")(version 3.0; acl \"aci1\"; allow (read,search,compare) authmethod=\"sasl DIGEST-MD5\";)"
             </script>
                 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
-                    'attributeName'          : 'aci' ,
-                    'newAttributeValue'      : curr_aci ,
-                    'changetype'             : 'add' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
+                'attributeName'          : 'aci' ,
+                'newAttributeValue'      : curr_aci ,
+                'changetype'             : 'add'
+              }
             </call>
                 
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equal sasl, sasl authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equal sasl, sasl authentication'
             </message>
 
             <call function="'AnonSearchObject'">
@@ -1038,61 +1032,60 @@
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg' }
+                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
     
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
                'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal sasl, simple authentication'
             </message>
 
             <call function="'SearchObject'">
-              { 'dsInstanceHost'   : DIRECTORY_INSTANCE_HOST ,
-                'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
-                'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
-                'dsInstancePswd'   : 'frogleg' ,
-                'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+              { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'   : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
+                'dsInstancePswd' : 'frogleg' ,
+                'dsBaseDN'       : 'dc=example,dc=com' ,
+                'dsFilter'       : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
     
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal sasl, deleting authmethod ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal sasl, deleting authmethod ACI'
             </message>
 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
-                    'attributeName'          : 'aci' ,
-                    'newAttributeValue'      : curr_aci ,
-                    'changetype'             : 'delete' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                 'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
+                 'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                 'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                 'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
+                 'attributeName'          : 'aci' ,
+                 'newAttributeValue'      : curr_aci ,
+                  'changetype'             : 'delete'
+              }
              </call>
                 
              <message>
@@ -1100,11 +1093,12 @@
             </message>
 
             <call function="'modifyGlobalAci'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'aciValue'               : global_aci ,
-                    'opType'                 : 'add' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'aciValue'               : global_aci ,
+                'opType'                 : 'add'
+              }
             </call>
             
             <call function="'testCase_Postamble'"/>
@@ -1147,21 +1141,20 @@
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg' }
+                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
                'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, simple authentication'
@@ -1173,40 +1166,40 @@
                 'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
                 'dsInstancePswd'   : 'frogleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+                'dsFilter'         : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, delete global search ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, delete global search ACI'
             </message>
 
             <script>
-                    global_aci="(targetattr!=\"userPassword||authPassword\")(version 3.0; acl \"Anonymous read access\"; allow (read,search,compare) userdn=\"ldap:///anyone\";)"
+              global_aci="(targetattr!=\"userPassword||authPassword\")(version 3.0; acl \"Anonymous read access\"; allow (read,search,compare) userdn=\"ldap:///anyone\";)"
             </script>
                 
             <call function="'modifyGlobalAci'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'aciValue'               : global_aci ,
-                    'opType'                 : 'remove' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'aciValue'               : global_aci ,
+                'opType'                 : 'remove'
+              }
             </call>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equal simple, sasl authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equal simple, sasl authentication'
             </message>
 
             <call function="'AnonSearchObject'">
@@ -1214,24 +1207,23 @@
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg' }
+                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, simple authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, simple authentication'
             </message>
 
             <call function="'SearchObject'">
@@ -1240,43 +1232,43 @@
                 'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
                 'dsInstancePswd'   : 'frogleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+                'dsFilter'         : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, adding authmethod ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, adding authmethod ACI'
             </message>
 
             <script>
-                    curr_aci="(targetattr=\"*\")(version 3.0; acl \"aci1\"; allow (read,search,compare) authmethod=\"simple\";)"
+              curr_aci="(targetattr=\"*\")(version 3.0; acl \"aci1\"; allow (read,search,compare) authmethod=\"simple\";)"
             </script>
                 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
-                    'attributeName'          : 'aci' ,
-                    'newAttributeValue'      : curr_aci ,
-                    'changetype'             : 'add' }
-             </call>
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
+                'attributeName'          : 'aci' ,
+                'newAttributeValue'      : curr_aci ,
+                'changetype'             : 'add'
+              }
+            </call>
                 
-             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equal simple, sasl authentication'
+            <message>
+              'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equal simple, sasl authentication'
             </message>
 
             <call function="'AnonSearchObject'">
@@ -1284,24 +1276,23 @@
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg' }
+                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, simple authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, simple authentication'
             </message>
 
             <call function="'SearchObject'">
@@ -1310,35 +1301,35 @@
                 'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
                 'dsInstancePswd'   : 'frogleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+                'dsFilter'         : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, deleting authmethod ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equal simple, deleting authmethod ACI'
             </message>
 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
-                    'attributeName'          : 'aci' ,
-                    'newAttributeValue'      : curr_aci ,
-                    'changetype'             : 'delete' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
+                'attributeName'          : 'aci' ,
+                'newAttributeValue'      : curr_aci ,
+                'changetype'             : 'delete'
+              }
              </call>
                 
              <message>
@@ -1346,11 +1337,12 @@
             </message>
 
             <call function="'modifyGlobalAci'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'aciValue'               : global_aci ,
-                    'opType'                 : 'add' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'aciValue'               : global_aci ,
+                'opType'                 : 'add'
+              }
             </call>
             
             <call function="'testCase_Postamble'"/>
@@ -1393,24 +1385,23 @@
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg' }
+                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, simple authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, simple authentication'
             </message>
 
             <call function="'SearchObject'">
@@ -1419,40 +1410,40 @@
                 'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
                 'dsInstancePswd'   : 'frogleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+                'dsFilter'         : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, delete global search ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, delete global search ACI'
             </message>
 
             <script>
-                    global_aci="(targetattr!=\"userPassword||authPassword\")(version 3.0; acl \"Anonymous read access\"; allow (read,search,compare) userdn=\"ldap:///anyone\";)"
+              global_aci="(targetattr!=\"userPassword||authPassword\")(version 3.0; acl \"Anonymous read access\"; allow (read,search,compare) userdn=\"ldap:///anyone\";)"
             </script>
                 
             <call function="'modifyGlobalAci'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'aciValue'               : global_aci ,
-                    'opType'                 : 'remove' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'aciValue'               : global_aci ,
+                'opType'                 : 'remove'
+              }
             </call>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod  not equals simple, sasl authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod  not equals simple, sasl authentication'
             </message>
 
             <call function="'AnonSearchObject'">
@@ -1460,24 +1451,23 @@
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg' }
+                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, simple authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, simple authentication'
             </message>
 
             <call function="'SearchObject'">
@@ -1486,43 +1476,43 @@
                 'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
                 'dsInstancePswd'   : 'frogleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+                'dsFilter'         : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, adding authmethod ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, adding authmethod ACI'
             </message>
 
             <script>
-                    curr_aci="(targetattr=\"*\")(version 3.0; acl \"aci1\"; allow (read,search,compare) authmethod!=\"simple\";)"
+              curr_aci="(targetattr=\"*\")(version 3.0; acl \"aci1\"; allow (read,search,compare) authmethod!=\"simple\";)"
             </script>
                 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
-                    'attributeName'          : 'aci' ,
-                    'newAttributeValue'      : curr_aci ,
-                    'changetype'             : 'add' }
-             </call>
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
+                'attributeName'          : 'aci' ,
+                'newAttributeValue'      : curr_aci ,
+                'changetype'             : 'add'
+              }
+            </call>
                 
-             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod  not equals simple, sasl authentication'
+            <message>
+              'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod  not equals simple, sasl authentication'
             </message>
 
             <call function="'AnonSearchObject'">
@@ -1530,24 +1520,23 @@
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg' }
+                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, simple authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, simple authentication'
             </message>
 
             <call function="'SearchObject'">
@@ -1556,47 +1545,48 @@
                 'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
                 'dsInstancePswd'   : 'frogleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+                'dsFilter'         : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, deleting authmethod ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, deleting authmethod ACI'
             </message>
 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
-                    'attributeName'          : 'aci' ,
-                    'newAttributeValue'      : curr_aci ,
-                    'changetype'             : 'delete' }
-             </call>
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
+                'attributeName'          : 'aci' ,
+                'newAttributeValue'      : curr_aci ,
+                'changetype'             : 'delete'
+              }
+            </call>
                 
-             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, put back global search ACI'
+            <message>
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod  not equals simple, put back global search ACI'
             </message>
 
             <call function="'modifyGlobalAci'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'aciValue'               : global_aci ,
-                    'opType'                 : 'add' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'aciValue'               : global_aci ,
+                'opType'                 : 'add'
+              }
             </call>
             
             <call function="'testCase_Postamble'"/>
@@ -1631,7 +1621,7 @@
             <call function="'testCase_Preamble'"/>
 
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equals none, sasl authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equals none, sasl authentication'
             </message>
 
             <call function="'AnonSearchObject'">
@@ -1639,24 +1629,23 @@
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg' }
+                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, simple authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, simple authentication'
             </message>
 
             <call function="'SearchObject'">
@@ -1665,40 +1654,40 @@
                 'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
                 'dsInstancePswd'   : 'frogleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+                'dsFilter'         : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, delete global search ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, delete global search ACI'
             </message>
 
             <script>
-                    global_aci="(targetattr!=\"userPassword||authPassword\")(version 3.0; acl \"Anonymous read access\"; allow (read,search,compare) userdn=\"ldap:///anyone\";)"
+              global_aci="(targetattr!=\"userPassword||authPassword\")(version 3.0; acl \"Anonymous read access\"; allow (read,search,compare) userdn=\"ldap:///anyone\";)"
             </script>
                 
             <call function="'modifyGlobalAci'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'aciValue'               : global_aci ,
-                    'opType'                 : 'remove' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'aciValue'               : global_aci ,
+                'opType'                 : 'remove'
+              }
             </call>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equals none, sasl authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equals none, sasl authentication'
             </message>
 
             <call function="'AnonSearchObject'">
@@ -1707,24 +1696,23 @@
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
                 'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w bad',
-                'expectedRC'       : 49 }
+                'expectedRC'       : 49
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, simple authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, simple authentication'
             </message>
 
             <call function="'SearchObject'">
@@ -1734,43 +1722,43 @@
                 'dsInstancePswd'   : 'bad' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*' ,
-                'expectedRC'       : 49 }
+                'expectedRC'       : 49
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
+              }
             </call>
-                
-            <if expr="returnCode != '0'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, adding authmethod ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, adding authmethod ACI'
             </message>
 
             <script>
-                    curr_aci="(targetattr=\"*\")(version 3.0; acl \"aci1\"; allow (read,search,compare) authmethod=\"none\";)"
+              curr_aci="(targetattr=\"*\")(version 3.0; acl \"aci1\"; allow (read,search,compare) authmethod=\"none\";)"
             </script>
                 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
-                    'attributeName'          : 'aci' ,
-                    'newAttributeValue'      : curr_aci ,
-                    'changetype'             : 'add' }
-             </call>
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
+                'attributeName'          : 'aci' ,
+                'newAttributeValue'      : curr_aci ,
+                'changetype'             : 'add'
+              }
+            </call>
                 
-             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equals none, sasl authentication'
+            <message>
+              'Security: SASL DIGEST-MD5: User (dn:) Binding with authmethod equals none, sasl authentication'
             </message>
 
             <call function="'AnonSearchObject'">
@@ -1778,24 +1766,23 @@
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg' }
+                'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w frogleg'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, simple authentication'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, simple authentication'
             </message>
 
             <call function="'SearchObject'">
@@ -1804,47 +1791,48 @@
                 'dsInstanceDn'     : 'uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com' ,
                 'dsInstancePswd'   : 'frogleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
-                'dsFilter'         : 'objectclass=*'  }
+                'dsFilter'         : 'objectclass=*'
+              }
             </call>
 
             <script> 
-                 returnString = STAXResult[0][1]
+              returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-                    { 'returnString'       : returnString ,
-                      'testString'         : 'dn: uid=tmorris,ou=People' }
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 1
+              }
             </call>
-                
-            <if expr="returnCode != '1'">
-                    <tcstatus result="'fail'"/>
-            </if>
             
             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, deleting authmethod ACI'
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, deleting authmethod ACI'
             </message>
 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
-                    'attributeName'          : 'aci' ,
-                    'newAttributeValue'      : curr_aci ,
-                    'changetype'             : 'delete' }
-             </call>
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'DNToModify'             : 'o=SASL Tests,dc=example,dc=com' ,
+                'attributeName'          : 'aci' ,
+                'newAttributeValue'      : curr_aci ,
+                'changetype'             : 'delete'
+              }
+            </call>
                 
-             <message>
-               'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, put back global search ACI'
+            <message>
+              'Security: SASL DIGEST-MD5: User (dn:) Binding With ACI with authmethod equals none, put back global search ACI'
             </message>
 
             <call function="'modifyGlobalAci'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'aciValue'               : global_aci ,
-                    'opType'                 : 'add' }
+              { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
+                'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
+                'aciValue'               : global_aci ,
+                'opType'                 : 'add'
+              }
             </call>
             
             <call function="'testCase_Postamble'"/>
@@ -3276,15 +3264,13 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 1
               }
             </call>
-                
-            <if expr="returnCode != '1'">
-              <tcstatus result="'fail'"/>
-            </if>
+            
             <call function="'testCase_Postamble'"/>
             
           </sequence>
@@ -3339,15 +3325,13 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 1
               }
             </call>
-                
-            <if expr="returnCode != '1'">
-              <tcstatus result="'fail'"/>
-            </if>
+            
             <call function="'testCase_Postamble'"/>
             
           </sequence>
@@ -3417,17 +3401,14 @@
             <script> 
               returnString = STAXResult[0][1]
             </script> 
-    
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString ,
-                'testString'   : 'dn: uid=tmorris,ou=People'
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'dn: uid=tmorris,ou=People',
+                'expectedRC'     : 0
               }
             </call>
-                
-            <if expr="returnCode != '0'">
-              <tcstatus result="'fail'"/>
-            </if>
-            
+    
             <call function="'testCase_Postamble'"/>
             
           </sequence>
@@ -3501,15 +3482,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 0
               }
             </call>
-                
-            <if expr="returnCode != '0'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -3587,15 +3565,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 0
               }
             </call>
-                
-            <if expr="returnCode != '0'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -3674,15 +3649,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 1
               }
             </call>
-                
-            <if expr="returnCode != '1'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -3761,15 +3733,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 0
               }
             </call>
-                
-            <if expr="returnCode != '0'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -3848,15 +3817,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 1
               }
             </call>
-                
-            <if expr="returnCode != '1'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -3934,15 +3900,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 0
               }
             </call>
-                
-            <if expr="returnCode != '0'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -4021,15 +3984,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 1
               }
             </call>
-                
-            <if expr="returnCode != '1'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -4108,19 +4068,13 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
-              }
-            </call>
-                
-            <if expr="returnCode != '0'">
-              <tcstatus result="'fail'"/>
-            </if>
-            
             <!-- #3723: SSF bind rule: != operator not working -->
-            <call function="'setKnownIssue'">
-              { 'issueId' : '3723' }
+            <call function="'searchString'">
+              { 'returnString'   : returnString,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 0,
+                'knownIssue'     : '3723'
+              }
             </call>
 
             <call function="'testCase_Postamble'"/>
@@ -4200,19 +4154,13 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
-              }
-            </call>
-                
-            <if expr="returnCode != '1'">
-              <tcstatus result="'fail'"/>
-            </if>
-
             <!-- #3723: SSF bind rule: != operator not working -->
-            <call function="'setKnownIssue'">
-              { 'issueId' : '3723' }
+            <call function="'searchString'">
+              { 'returnString'   : returnString,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 1,
+                'knownIssue'     : '3723'
+              }
             </call>
 
             <call function="'testCase_Postamble'"/>
@@ -4292,19 +4240,13 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
-              }
-            </call>
-                
-            <if expr="returnCode != '1'">
-              <tcstatus result="'fail'"/>
-            </if>
-
             <!-- #3723: SSF bind rule: != operator not working -->
-            <call function="'setKnownIssue'">
-              { 'issueId' : '3723' }
+            <call function="'searchString'">
+              { 'returnString'   : returnString,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 1,
+                'knownIssue'     : '3723'
+              }
             </call>
 
             <call function="'testCase_Postamble'"/>
@@ -4420,15 +4362,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 1
               }
             </call>
-                
-            <if expr="returnCode != '1'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -4504,15 +4443,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 0
               }
             </call>
-                
-            <if expr="returnCode != '0'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -4626,15 +4562,12 @@
               'Search result:   %s' % returnString
             </message>
 
-            <call function="'searchStringForSubstring'">
-              { 'returnString' : returnString,
-                'testString'   : 'uid=tmorris,ou=People'
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'uid=tmorris,ou=People',
+                'expectedRC'     : 0
               }
             </call>
-                
-            <if expr="returnCode != '0'">
-              <tcstatus result="'fail'"/>
-            </if>
             
             <call function="'testCase_Postamble'"/>
             
@@ -4671,50 +4604,54 @@
             </message>
 
             <call function="'modifyPwdPolicy'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'propertyName'           : 'Default Password Policy' ,
-                    'attributeName'          : 'default-password-storage-scheme' ,
-                    'attributeValue'         : 'Salted SHA-1' }
+              { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+                'dsInstanceDn'   : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
+                'propertyName'   : 'Default Password Policy' ,
+                'attributeName'  : 'default-password-storage-scheme' ,
+                'attributeValue' : 'Salted SHA-1'
+              }
             </call>
             
             <message>
-               'Security: SASL DIGEST-MD5: Postamble Step 2 - Admin Restting Password for two users'
+              'Security: SASL DIGEST-MD5: Postamble Step 2 - Admin Restting Password for two users'
             </message>
 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'uid=jsprinter, ou=People, o=SASL Tests, dc=example,dc=com' ,
-                    'attributeName'          : 'userpassword' ,
-                    'newAttributeValue'      : 'catleg' ,
-                    'changetype'             : 'replace' }
+              { 'dsInstanceHost'    : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'    : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'      : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,
+                'DNToModify'        : 'uid=jsprinter, ou=People, o=SASL Tests, dc=example,dc=com' ,
+                'attributeName'     : 'userpassword' ,
+                'newAttributeValue' : 'catleg' ,
+                'changetype'        : 'replace'
+              }
             </call>
                 
             <call function="'modifyAnAttribute'">
-                  { 'dsInstanceHost'         : DIRECTORY_INSTANCE_HOST ,
-                    'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
-                    'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
-                    'dsInstancePswd'         : DIRECTORY_INSTANCE_PSWD ,
-                    'DNToModify'             : 'uid=jwalleye, ou=People, o=SASL Realm Tests, dc=example,dc=com' ,
-                    'attributeName'          : 'userpassword' ,
-                    'newAttributeValue'      : 'catleg' ,
-                    'changetype'             : 'replace' }
+              { 'dsInstanceHost'    : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'    : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'      : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,
+                'DNToModify'        : 'uid=jwalleye, ou=People, o=SASL Realm Tests, dc=example,dc=com' ,
+                'attributeName'     : 'userpassword' ,
+                'newAttributeValue' : 'catleg' ,
+                'changetype'        : 'replace'
+              }
             </call>
             
             <message>
-               'Security: SASL DIGEST-MD5: Postamble Step 3 - Admin Deleting Realm'
+              'Security: SASL DIGEST-MD5: Postamble Step 3 - Admin Deleting Realm'
             </message>
 
             <call function="'modifyEntry'">
-              { 'dsInstanceHost'      : DIRECTORY_INSTANCE_HOST ,
-                'dsInstancePort'      : DIRECTORY_INSTANCE_PORT ,
-                'dsInstanceDn'        : DIRECTORY_INSTANCE_DN ,
-                'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
-                'entryToBeModified'   : '%s/security/sasl/admin_del_realm.ldif' % remote.data }
+              { 'dsInstanceHost'    : DIRECTORY_INSTANCE_HOST ,
+                'dsInstancePort'    : DIRECTORY_INSTANCE_PORT ,
+                'dsInstanceDn'      : DIRECTORY_INSTANCE_DN ,
+                'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,
+                'entryToBeModified' : '%s/security/sasl/admin_del_realm.ldif' % remote.data
+              }
             </call>
 
             <message>
@@ -4728,20 +4665,22 @@
                 'dsInstancePswd'   : 'catleg' ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
-                'extraParams'      : '-s base' }
+                'extraParams'      : '-s base'
+              }
             </call>
 
             <message>
-               'Security: SASL DIGEST-MD5: Postamble Step 5 - User (dn:) Binding 2'
+              'Security: SASL DIGEST-MD5: Postamble Step 5 - User (dn:) Binding 2'
             </message>
 
-           <call function="'AnonSearchObject'">
+            <call function="'AnonSearchObject'">
               { 'dsInstanceHost'   : DIRECTORY_INSTANCE_HOST ,
                 'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                 'dsBaseDN'         : 'dc=example,dc=com' ,
                 'dsFilter'         : 'objectclass=*'  ,
                 'extraParams'      : '-o mech=DIGEST-MD5 -o "authid=dn:uid=jwalleye,ou=People,o=SASL Realm Tests,dc=example,dc=com" -w catleg' ,
-                'expectedRC'       : 49 }
+                'expectedRC'       : 49
+              }
             </call>
             
             <call function="'testCase_Postamble'"/>
diff --git a/opends/tests/staf-tests/shared/functions/tools.xml b/opends/tests/staf-tests/shared/functions/tools.xml
index 4b3f5ba..a65b41b 100755
--- a/opends/tests/staf-tests/shared/functions/tools.xml
+++ b/opends/tests/staf-tests/shared/functions/tools.xml
@@ -535,6 +535,13 @@
         <function-arg-property name="type" value="DN"/>
       </function-arg-def>
 
+      <function-arg-def name="knownIssue" type="optional" default="None">
+        <function-arg-description>
+          Known issue. Corresponds to an issue number.
+        </function-arg-description>
+        <function-arg-property name="type" value="string" />
+      </function-arg-def>
+
     </function-list-args>
     <sequence>
       <script>
@@ -612,7 +619,7 @@
       <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 -->  
+         !   servers that failed to do so --> 
         <script>
           myRC = 1
           comma = ','  
@@ -629,7 +636,8 @@
       <call function="'checktestRC'">
         { 'returncode' : myRC,
           'result'     : failingServerList,
-          'expected'   : 0
+          'expected'   : 0,
+          'issue'      : knownIssue
         }
       </call>
       <return>[myRC, failedServers]</return>
@@ -681,6 +689,13 @@
         <function-arg-property name="type" value="filename"/>
       </function-arg-def>
 
+      <function-arg-def name="knownIssue" type="optional" default="None">
+        <function-arg-description>
+          Known issue. Corresponds to an issue number.
+        </function-arg-description>
+        <function-arg-property name="type" value="string" />
+      </function-arg-def>
+      
     </function-list-args>
     <sequence>
       <script>
@@ -742,7 +757,8 @@
       <call function="'checktestRC'">
         { 'returncode' : myRC,
           'result'     : failingServerList ,
-          'expected'   : 0
+          'expected'   : 0,
+          'issue'      : knownIssue
         }
       </call>
       <return>[myRC, failedServers]</return>

--
Gitblit v1.10.0