From 24e60ede26bf2a623e6aa41617106f9df918d1bc Mon Sep 17 00:00:00 2001
From: Gary Williams <gary.williams@forgerock.com>
Date: Mon, 07 Mar 2011 12:45:12 +0000
Subject: [PATCH] New functional tests for schema structural objects

---
 opends/tests/staf-tests/functional-tests/shared/data/schema/ldifs/schema_start.ldif            |    6 
 opends/tests/staf-tests/functional-tests/testcases/schema/schema.xml                           |    3 
 opends/tests/staf-tests/functional-tests/testcases/schema/structure/schema_structure.xml       |  138 ++++++++++++
 opends/tests/staf-tests/functional-tests/testcases/schema/structure/schema_structure_tests.xml |  480 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 626 insertions(+), 1 deletions(-)

diff --git a/opends/tests/staf-tests/functional-tests/shared/data/schema/ldifs/schema_start.ldif b/opends/tests/staf-tests/functional-tests/shared/data/schema/ldifs/schema_start.ldif
index 563dcc0..1cf76dd 100644
--- a/opends/tests/staf-tests/functional-tests/shared/data/schema/ldifs/schema_start.ldif
+++ b/opends/tests/staf-tests/functional-tests/shared/data/schema/ldifs/schema_start.ldif
@@ -21,6 +21,7 @@
 # CDDL HEADER END
 #
 #      Copyright 2006-2009 Sun Microsystems, Inc.
+#      Portions Copyright 2011 ForgeRock AS
 #
 
 dn: dc=com
@@ -41,6 +42,11 @@
 objectclass: top
 objectclass: organizationalunit
 
+dn: o=schema structure tests,dc=example,dc=com
+o: extensible object tests
+objectclass: top
+objectclass: organization
+
 dn: o=rfc tests,dc=example,dc=com
 o: extensible object tests
 objectclass: top
diff --git a/opends/tests/staf-tests/functional-tests/testcases/schema/schema.xml b/opends/tests/staf-tests/functional-tests/testcases/schema/schema.xml
index dd44128..117a127 100644
--- a/opends/tests/staf-tests/functional-tests/testcases/schema/schema.xml
+++ b/opends/tests/staf-tests/functional-tests/testcases/schema/schema.xml
@@ -53,6 +53,7 @@
               suiteList.append('rfc')
               suiteList.append('dynamic')
               suiteList.append('solaris')
+              suiteList.append('structure')
             </script>
     
             <!-- Run the test suites -->
@@ -97,4 +98,4 @@
       </try>
     </sequence>
   </function>
-</stax>
\ No newline at end of file
+</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/schema/structure/schema_structure.xml b/opends/tests/staf-tests/functional-tests/testcases/schema/structure/schema_structure.xml
new file mode 100755
index 0000000..26b98b2
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/schema/structure/schema_structure.xml
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ ! 
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ ! 
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Copyright 2011 ForgeRock AS
+ ! -->
+<stax>
+  <defaultcall function="main_schema_structure"/>
+  <function name="main_schema_structure" scope="local">
+    <sequence>
+      <block name="'main_schema_structure'">
+        <try>
+          <sequence>
+            <script>
+              CurrentTestPath['group']='schema'        
+              CurrentTestPath['suite']='structure'
+              
+              __group=CurrentTestPath['group']
+              __groupdir='%s/testcases/%s' % (TESTS_DIR,__group)
+            </script>
+
+            <!--- Test Suite information
+            #@TestSuiteName       Native schema test suite
+            #@TestSuitePurpose    Verify LDAP Naming Services Schema Elements
+            #@TestSuiteID         Suite
+            #@TestSuiteGroup      Example
+            #@TestGroup           Example
+            #@TestScript          suite.xml
+            #@TestHTMLLink        http://opends.dev.java.net/
+            -->          
+            <call function="'testSuite_Preamble'"/>
+
+            <try>
+              <sequence> 
+
+                <call function="'common_setup'">
+                  {
+                    'quickStart'    : False ,
+                    'startServer'   : True  ,
+                    'loadData'      : True  ,
+                    'ldifFile'      : '%s/schema/ldifs/schema_start.ldif' % remote.data ,
+                    'stopServer'    : False
+                  }
+                </call>
+ 
+                <!-- List of Import of Test Functions -->
+                <script>
+                  importList=[]
+                  importList.append('structure/schema_structure_tests')
+                </script>
+
+                <!-- Import the files for this test suite -->
+                <iterate var="__import" in="importList">
+                  <import machine="STAF_LOCAL_HOSTNAME"
+                    file="'%s/%s.xml' % (__groupdir,__import)"/>
+                </iterate>                                                                       
+
+                <!-- Specific to structure schema tests -->
+                <script>
+                  __baseDN='o=Schema Structure tests, dc=example,%s' % server.suffix
+                </script>
+                                                    
+                <!-- List of Test Cases -->
+                <script>
+                  testsList=[]
+                  testsList.append('schema_structure_001')
+                  testsList.append('schema_structure_002')
+                </script>
+
+                <!-- Execute the Tests -->
+                <iterate var="__test" in="testsList">
+                  <sequence>
+                    <call function="'%s' % (__test)" />
+                  </sequence>
+                </iterate>                
+                                
+              </sequence>
+            <catch exception="'STAFException.TestSuite.SetupException'">
+              <sequence>
+                <message log="1" level="'fatal'">
+                  'Setup of test suite failed.'
+                </message>
+                <rethrow/>
+              </sequence>
+            </catch>
+
+            <finally>
+              <message>'Test Cases Completed.'</message>
+            </finally>
+
+            </try>
+
+          </sequence>
+          
+          <finally>
+            <sequence>
+              <!-- Test Suite Cleanup -->
+              <message>'Finally: Global Schema Cleanup.'</message>
+              <try>
+                <call function="'common_cleanup'" />
+              <catch exception="'STAFException'">
+                <sequence>
+                  <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
+                </sequence>
+              </catch>
+              <finally>
+                <call function="'testSuite_Postamble'"/>
+              </finally>
+              </try>
+            </sequence>
+          </finally>
+ 
+        </try>
+      </block>
+    </sequence>
+  </function>
+</stax>
diff --git a/opends/tests/staf-tests/functional-tests/testcases/schema/structure/schema_structure_tests.xml b/opends/tests/staf-tests/functional-tests/testcases/schema/structure/schema_structure_tests.xml
new file mode 100755
index 0000000..b1c1bf3
--- /dev/null
+++ b/opends/tests/staf-tests/functional-tests/testcases/schema/structure/schema_structure_tests.xml
@@ -0,0 +1,480 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ ! 
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ ! 
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/CDDLv1_0.txt.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Copyright 2011 ForgeRock AS
+ ! -->
+<stax>
+
+  <!-- Definition of Test Cases -->             
+
+  <!--- Test Case : Schema: Modify Add Core Auxiliary Object -->          
+  <!--- Test Case information
+  #@TestMarker          Schema
+  #@TestName            Schema: Modify Add Core Auxiliary Object
+  #@TestID              Modify Add Core Auxiliary Object
+  #@TestPurpose         Add a core auxiliary schema object to an existing entry
+  #@TestPreamble
+  #@TestSteps           Modify schema object LDAP protocol by Adding Auxiliary schema object
+  #@TestPostamble
+  #@TestResult          Test is successful if the result code is 0
+  -->                           
+  <function name="schema_structure_001" scope="local">
+    <testcase name="getTestCaseName('Modify Add Core Auxiliary Object')">                     
+      <sequence> 
+        <try>
+          <sequence>                
+            <call function="'testCase_Preamble'"/>
+            <message>
+               'Test Name = %s' % STAXCurrentTestcase
+            </message>
+
+            <!-- Add the new account object  -->       
+            <script>
+              ldapObject=[]
+              ldapObject.append('objectclass:top')
+              ldapObject.append('objectclass:domain')
+              ldapObject.append('dc:accounts')
+           </script>
+
+            <call function="'addAnEntry'">
+              { 'dsInstanceHost' : server.host,
+                'dsInstancePort' : server.port,
+                'dsInstanceDn'   : server.dn,
+                'dsInstancePswd' : server.password,
+                'DNToAdd'        : 'dc=accounts,%s' % __baseDN,
+                'listAttributes' : ldapObject
+              }
+            </call>
+
+            <script>
+              ldapObject=[]
+              ldapObject.append('objectclass:account')
+              ldapObject.append('uid:fsmart')
+              ldapObject.append('description:New account holder')
+           </script>
+
+            <call function="'addAnEntry'">
+              { 'dsInstanceHost' : server.host,
+                'dsInstancePort' : server.port,
+                'dsInstanceDn'   : server.dn,
+                'dsInstancePswd' : server.password,
+                'DNToAdd'        : 'uid=fsmart,dc=accounts,%s' % __baseDN,
+                'listAttributes' : ldapObject
+              }
+            </call>
+            
+            <!-- Read back the new account object  -->
+            <call function="'ldapSearchWithScript'">
+              { 'dsInstanceHost'   : server.host ,
+                'dsInstancePort'   : server.port ,
+                'dsInstanceDn'     : server.dn ,
+                'dsInstancePswd'   : server.password ,
+                'dsBaseDN'         : 'dc=accounts,%s' % __baseDN ,
+                'dsFilter'         : 'objectclass=*'
+              }
+            </call>
+
+            <script> 
+             returnString = STAXResult[0][1]
+            </script>
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'objectClass: account',
+                'searchType'     : 'substring'
+              }
+            </call>
+
+            <!-- Modify by adding an auxiliary schema object -->
+            <script>
+              ldapObject=[]
+              ldapObject.append('objectclass:simpleSecurityObject')
+              ldapObject.append('userpassword:secret12')
+           </script>
+
+            <call function="'modifyAnAttribute'">
+                { 'dsInstanceHost'         : server.host ,
+                  'dsInstancePort'         : server.port ,
+                  'dsInstanceDn'           : server.dn ,
+                  'dsInstancePswd'         : server.password ,
+                  'DNToModify'             : 'uid=fsmart,dc=accounts,%s' % __baseDN ,
+                  'listAttributes'         : ldapObject ,
+                  'changetype'             : 'add' }
+            </call>
+
+            <!-- Read back the changed object -->
+            <call function="'ldapSearchWithScript'">
+              { 'dsInstanceHost'   : server.host ,
+                'dsInstancePort'   : server.port ,
+                'dsInstanceDn'     : server.dn ,
+                'dsInstancePswd'   : server.password ,
+                'dsBaseDN'         : 'uid=fsmart,dc=accounts,%s' % __baseDN ,
+                'dsFilter'         : 'objectclass=*'
+              }
+            </call>
+
+            <script> 
+             returnString = STAXResult[0][1]
+            </script>
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'objectClass: simpleSecurityObject',
+                'searchType'     : 'substring'
+              }
+            </call>
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'userPassword',
+                'searchType'     : 'substring'
+              }
+            </call>
+
+            <!-- Delete accounts objects -->
+            <call function="'ldapDeleteWithScript'">
+              { 'dsDeleteSubtree' : 'TRUE'                          ,
+                'dsInstanceHost'  : server.host                     ,
+                'dsInstancePort'  : server.port                     ,
+                'dsInstanceDn'    : server.dn                       ,
+                'dsInstancePswd'  : server.password                 ,
+                'dsDn'            : ['dc=accounts,%s' % __baseDN] ,
+                'expectedRC'      : 'noCheck'
+              }
+            </call>
+          </sequence>
+  
+          <catch exception="'STAXException'" typevar="eType" var="eInfo">
+            <message log="1" level="'fatal'">
+              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+            </message>
+          </catch>
+          <finally>
+            <call function="'testCase_Postamble'"/>
+          </finally>
+        </try>
+      </sequence>
+    </testcase>
+  </function>
+
+  <!--- Test Case : Schema: Modify Delete Core Auxiliary Object -->          
+  <!--- Test Case information
+  #@TestMarker          Schema
+  #@TestName            Schema: Modify Delete Core Auxiliary Object
+  #@TestID              Modify Delete Core Auxiliary Object
+  #@TestPurpose         Delete a core auxiliary schema object to an existing entry
+  #@TestPreamble
+  #@TestSteps           Modify schema object LDAP protocol by deleting Auxiliary schema object
+  #@TestPostamble
+  #@TestResult          Test is successful if the result code is 0
+  -->
+  <function name="schema_structure_002" scope="local">
+    <testcase name="getTestCaseName('Modify Delete Core Auxiliary Object')">                     
+      <sequence> 
+        <try>
+          <sequence>                
+            <call function="'testCase_Preamble'"/>
+            <message>
+               'Test Name = %s' % STAXCurrentTestcase
+            </message>
+
+            <!-- Read back the new account object  -->
+            <call function="'ldapSearchWithScript'">
+              { 'dsInstanceHost'   : server.host ,
+                'dsInstancePort'   : server.port ,
+                'dsInstanceDn'     : server.dn ,
+                'dsInstancePswd'   : server.password ,
+                'dsBaseDN'         : 'dc=accounts,%s' % __baseDN ,
+                'dsFilter'         : 'objectclass=*',
+                'expectedRC'      : 'noCheck'
+              }
+            </call>
+
+            <if expr="RC == 32">
+
+              <sequence>
+                <!-- Add the new account object  -->       
+                <script>
+                  ldapObject=[]
+                  ldapObject.append('objectclass:top')
+                  ldapObject.append('objectclass:domain')
+                  ldapObject.append('dc:accounts')
+                </script>
+    
+                <call function="'addAnEntry'">
+                  { 'dsInstanceHost' : server.host,
+                    'dsInstancePort' : server.port,
+                    'dsInstanceDn'   : server.dn,
+                    'dsInstancePswd' : server.password,
+                    'DNToAdd'        : 'dc=accounts,%s' % __baseDN,
+                    'listAttributes' : ldapObject
+                  }
+                </call>
+
+              </sequence>
+              
+            </if>
+
+            <!-- Read back the new account object  -->
+            <call function="'ldapSearchWithScript'">
+              { 'dsInstanceHost'   : server.host ,
+                'dsInstancePort'   : server.port ,
+                'dsInstanceDn'     : server.dn ,
+                'dsInstancePswd'   : server.password ,
+                'dsBaseDN'         : 'uid=fsmart,dc=accounts,%s' % __baseDN ,
+                'dsFilter'         : 'objectclass=*',
+                'expectedRC'      : 'noCheck'
+              }
+            </call>
+
+            <if expr="RC == 32">
+
+              <sequence>              
+
+                <script>
+                  ldapObject=[]
+                  ldapObject.append('objectclass:account')
+                  ldapObject.append('objectclass:simpleSecurityObject')
+                  ldapObject.append('uid:fsmart')
+                  ldapObject.append('description:Another new account holder')
+                  ldapObject.append('userpassword:secret12')
+                </script>
+
+                <call function="'addAnEntry'">
+                  { 'dsInstanceHost' : server.host,
+                    'dsInstancePort' : server.port,
+                    'dsInstanceDn'   : server.dn,
+                    'dsInstancePswd' : server.password,
+                    'DNToAdd'        : 'uid=fsmart,dc=accounts,%s' % __baseDN,
+                    'listAttributes' : ldapObject
+                  }
+                </call>
+              </sequence>
+            </if>
+            
+            <!-- Read back the new account object  -->
+            <call function="'ldapSearchWithScript'">
+              { 'dsInstanceHost'   : server.host ,
+                'dsInstancePort'   : server.port ,
+                'dsInstanceDn'     : server.dn ,
+                'dsInstancePswd'   : server.password ,
+                'dsBaseDN'         : 'dc=accounts,%s' % __baseDN ,
+                'dsFilter'         : 'objectclass=*'
+              }
+            </call>
+
+            <script> 
+             returnString = STAXResult[0][1]
+            </script>
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'objectClass: account',
+                'searchType'     : 'substring'
+              }
+            </call>
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'objectClass: simpleSecurityObject',
+                'searchType'     : 'substring'
+              }
+            </call>
+
+            <!-- Modify by adding an auxiliary schema object -->
+            <script>
+              ldapObject=[]
+              ldapObject.append('objectclass:simpleSecurityObject')
+              ldapObject.append('userpassword:secret12')
+           </script>
+
+            <call function="'modifyAnAttribute'">
+                { 'dsInstanceHost'         : server.host ,
+                  'dsInstancePort'         : server.port ,
+                  'dsInstanceDn'           : server.dn ,
+                  'dsInstancePswd'         : server.password ,
+                  'DNToModify'             : 'uid=fsmart,dc=accounts,%s' % __baseDN ,
+                  'listAttributes'         : ldapObject ,
+                  'changetype'             : 'delete' }
+            </call>
+
+            <!-- Read back the changed object -->
+            <call function="'ldapSearchWithScript'">
+              { 'dsInstanceHost'   : server.host ,
+                'dsInstancePort'   : server.port ,
+                'dsInstanceDn'     : server.dn ,
+                'dsInstancePswd'   : server.password ,
+                'dsBaseDN'         : 'uid=fsmart,dc=accounts,%s' % __baseDN ,
+                'dsFilter'         : 'objectclass=*'
+              }
+            </call>
+
+            <script> 
+             returnString = STAXResult[0][1]
+            </script>
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'objectClass: simpleSecurityObject',
+                'searchType'     : 'substring' ,
+                'expectedRC'     : 1
+              }
+            </call>
+
+            <call function="'searchString'">
+              { 'returnString'   : returnString ,
+                'expectedString' : 'userPassword',
+                'searchType'     : 'substring',
+                'expectedRC'     : 1
+              }
+            </call>
+
+            <!-- Delete accounts objects -->
+            <call function="'ldapDeleteWithScript'">
+              { 'dsDeleteSubtree' : 'TRUE'                          ,
+                'dsInstanceHost'  : server.host                     ,
+                'dsInstancePort'  : server.port                     ,
+                'dsInstanceDn'    : server.dn                       ,
+                'dsInstancePswd'  : server.password                 ,
+                'dsDn'            : ['dc=accounts,%s' % __baseDN] ,
+                'expectedRC'      : 'noCheck'
+              }
+            </call>
+               
+          </sequence>
+  
+          <catch exception="'STAXException'" typevar="eType" var="eInfo">
+            <message log="1" level="'fatal'">
+              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+            </message>
+          </catch>
+          <finally>
+            <call function="'testCase_Postamble'"/>
+          </finally>
+        </try>
+      </sequence>
+    </testcase>
+  </function>
+
+  <!--- Test Case : Schema: Add Structural Schema Entries -->          
+  <!--- Test Case information
+  #@TestMarker          Schema
+  #@TestName            Schema: Add Structural Schema Entries
+  #@TestID              Test
+  #@TestPurpose         Add Structural schema entries
+  #@TestPreamble
+  #@TestSteps           Add over LDAP protocol Structural schema entries
+  #@TestPostamble
+  #@TestResult          Test is successful if the result code is 0
+  -->                           
+  <function name="schema_structure_003" scope="local">
+    <testcase name="getTestCaseName('Structural Object Superclass Chain')">                     
+      <sequence> 
+        <try>
+          <sequence>                
+            <call function="'testCase_Preamble'"/>
+            <message>
+               'Test Name = %s' % STAXCurrentTestcase
+            </message>
+
+            <!-- Define a custom object user account-->
+            <script>
+              schema=[]
+              schema.append('attributeTypes: ( accountnameattr-oid NAME \'account-name\' )')
+              schema.append('attributeTypes: ( accountnumattr-oid NAME \'account-num\' )')
+              schema.append('attributeTypes: ( accounttypeattr-oid NAME \'account-type\' )')
+              schema.append('objectClasses: ( accountoc-oid NAME \'bankaccount\' SUP Person STRUCTURAL MUST account-name MAY account-number account-type)')
+            </script>
+
+            <!-- Add a custom object user account-->
+            <call function="'modifyAnAttribute'">
+              { 'dsInstanceHost' : server.host      ,
+                'dsInstancePort' : server.port      ,
+                'dsInstanceDn'   : server.dn        ,
+                'dsInstancePswd' : server.password  ,
+                'DNToModify'     : 'cn=schema'      ,
+                'listAttributes' : schema           ,
+                'changetype'     : 'add'
+              }
+            </call>
+
+            <!-- Add the new account object  -->       
+            <script>
+              ldapObject=[]
+              ldapObject.append('objectclass:top')
+              ldapObject.append('objectclass:domain')
+              ldapObject.append('dc:accounts')
+           </script>
+
+            <call function="'addAnEntry'">
+              { 'dsInstanceHost' : server.host,
+                'dsInstancePort' : server.port,
+                'dsInstanceDn'   : server.dn,
+                'dsInstancePswd' : server.password,
+                'DNToAdd'        : 'dc=accounts,dc=example,dc=com',
+                'listAttributes' : ldapObject
+              }
+            </call>
+
+            <script>
+              ldapObject=[]
+              ldapObject.append('objectclass:bankaccount')
+              ldapObject.append('account-name: Mr Finbar Soap')
+              ldapObject.append('cn: Finbar Soap')
+              ldapObject.append('sn: Soap')
+           </script>
+
+            <call function="'addAnEntry'">
+              { 'dsInstanceHost' : server.host,
+                'dsInstancePort' : server.port,
+                'dsInstanceDn'   : server.dn,
+                'dsInstancePswd' : server.password,
+                'DNToAdd'        : 'cn=dc=accounts,dc=example,dc=com',
+                'listAttributes' : ldapObject
+              }
+            </call>
+            
+            <!-- Read back the new account object  -->            
+
+            <!-- Add a new auxillary schema object -->
+
+            <!-- Read back the changed object -->
+
+          </sequence>
+  
+          <catch exception="'STAXException'" typevar="eType" var="eInfo">
+            <message log="1" level="'fatal'">
+              '%s: Test failed. eInfo(%s)' % (eType,eInfo)
+            </message>
+          </catch> 
+          <finally>
+            <call function="'testCase_Postamble'"/>
+          </finally>
+        </try>
+      </sequence>
+    </testcase>
+  </function>
+   
+</stax>

--
Gitblit v1.10.0