<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "../../../shared/stax.dtd">
<!--
 ! CDDL HEADER START
 !
 ! The contents of this file are subject to the terms of the
 ! Common Development and Distribution License, Version 1.0 only
 ! (the "License").  You may not use this file except in compliance
 ! with the License.
 !
 ! You can obtain a copy of the license at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
 ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 ! See the License for the specific language governing permissions
 ! and limitations under the License.
 !
 ! When distributing Covered Code, include this CDDL HEADER in each
 ! file and include the License file at
 ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 ! add the following below this CDDL HEADER, with the fields enclosed
 ! by brackets "[]" replaced with your own identifying information:
 !      Portions Copyright [yyyy] [name of copyright owner]
 !
 ! CDDL HEADER END
 !
 !      Copyright 2007-2008 Sun Microsystems, Inc.
 !      Portions Copyright 2013 ForgeRock AS
 ! -->
<stax>
  <defaultcall function="main_sample" />

  <function name="main_sample">

    <function-list-args>
      <function-required-arg name="STAXParentID"/>
    </function-list-args>

    <sequence>

      <block name="'sample'">

        <sequence>
          <!--- Load the job environment for the test group execution -->
          <import machine="STAF_LOCAL_HOSTNAME"
              file="'%s/environment.xml' % TESTS_FUNCTIONS_DIR"/>
          <call function="'loadJobEnvironment'">
            { 'parent' : STAXParentID }
          </call>

          <script>
            CurrentTestPath['group']= 'sample'
            envAlreadyLoaded='true'
          </script>

          <!---
            #@TestSuiteName             Sample
            #@TestSuitePurpose          Illustrate how to easily contribute functional tests
            #@TestSuiteGroup            Sample
            #@TestScript                aci_add_entry.xml
          -->

          <!-- Try/catch/finally structure are a handy way to alter the execution
           flow of a suite in front of unexpected conditions
          -->
          <try>
            <!-- this is an example of how to loop through a list of functions to
             run instead of duplicating calls
             -->
            <sequence>
              <iterate in="['testGroup_Preamble','testSuite_Preamble','sample_setup']" var="setupStep">
                <!-- the sequence tag is superfluous here since there is only a
                 single instruction to execute within the iterate block
                 -->
                <call function="setupStep" />
              </iterate>
              <iterate in="['sample_test','knownIssue_test','passing_test','inconclusive_test','failing_test']" var="testStep">
                <!-- the sequence tag is superfluous here since there is only a
                 single instruction to execute within the iterate block
                 -->
                <call function="testStep" />
              </iterate>
            </sequence>
            <catch exception="'STAFException.Topology.CreationException'">
              <!-- it is a good idea to make sure that the messages getting
               sent to the gui also make their way in the logs for easier
               after-the-fact log mining. Use log="1" wherever it makes sense
               Setting the log level to an appropriate value will also make
               troubleshooting and debugging easier.
               Level values can be (among others):
                . fatal
                . error
                . warning
                . info
                . trace
                . debug
               -->
              <message log="1" level="'fatal'">'Could not create the topology. Bailing out.'</message>
            </catch>
            <catch exception="'STAXException.Topology.StartException'">
              <message log="1" level="'fatal'">'Could not start at least one server in the topology. Bailing out.'</message>
            </catch>
            <finally>
              <iterate in="['sample_cleanup','testSuite_Postamble','testGroup_Postamble']" var="testStep">
                <call function="testStep" />
              </iterate>
            </finally>
          </try>

        </sequence>
      </block>
    </sequence>
  </function>
  
  <!-- the test -->
  <function name="sample_test">
    <!---
      Place test-specific test information here.
      The tag, TestMarker, must be the same as the tag, TestSuiteName.
      #@TestMarker                Sample
      #@TestName                  sample_test
      #@TestIssue                 xyz
      #@TestPurpose               Illustrate how to issue a query on OpenDS
      #@TestPreamble              none
      #@TestStep                  Fetch all the entries in the server
      #@TestPostamble             none
      #@TestResult                Success if OpenDS returns 0
    -->
    <block name="STAXCurrentFunction">
      <sequence>
        <script>
          CurrentTestPath['suite']= 'search'
        </script>
        <testcase name="getTestCaseName(STAXCurrentFunction)">
          <sequence>
            <call function="'testCase_Preamble'" />
            <call function="'SearchObject'">
            { 'dsInstanceHost'   : DIRECTORY_INSTANCE_HOST ,
              'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
              'dsInstanceDn'     : DIRECTORY_INSTANCE_DN   ,
              'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
              'dsBaseDN'         : DIRECTORY_INSTANCE_SFX  ,
              'dsFilter'         : 'objectclass=*'         }
            </call>
            <call function="'testCase_Postamble'" />
          </sequence>
        </testcase>
      </sequence>
    </block>
  </function>

  <!-- the test -->
  <function name="knownIssue_test">
    <!---
      Place test-specific test information here.
      The tag, TestMarker, must be the same as the tag, TestSuiteName.
      #@TestMarker                Sample
      #@TestName                  sample_test
      #@TestIssue                 xyz
      #@TestPurpose               Illustrate how to issue a query on OpenDS
      #@TestPreamble              none
      #@TestStep                  Fetch all the entries in the server
      #@TestPostamble             none
      #@TestResult                Success if OpenDS returns 0
    -->
    <block name="STAXCurrentFunction">
      <sequence>
        <script>
          CurrentTestPath['suite']= 'search'
        </script>
        <testcase name="getTestCaseName(STAXCurrentFunction)">
          <sequence>
            <call function="'testCase_Preamble'" />
            <!-- search for an entry that does not exist -->
            <call function="'SearchObject'">
            { 'dsInstanceHost'   : DIRECTORY_INSTANCE_HOST ,
              'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
              'dsInstanceDn'     : DIRECTORY_INSTANCE_DN   ,
              'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
              'dsBaseDN'         : DIRECTORY_INSTANCE_SFX  ,
              'dsFilter'         : 'wrongfilter' ,
              'knownIssue'       : 'xyz'         }
            </call>
            <call function="'testCase_Postamble'" />
          </sequence>
        </testcase>
      </sequence>
    </block>
  </function>
  
  <!-- the dummy failing test -->
  <function name="failing_test">
    <!---
      Place test-specific test information here.
      The tag, TestMarker, must be the same as the tag, TestSuiteName.
      #@TestMarker                Sample
      #@TestName                  failing_test
      #@TestIssue                 xyz
      #@TestPurpose               Illustrate how to issue a query on OpenDS
      #@TestPreamble              none
      #@TestStep                  Fetch all the entries in the server
      #@TestPostamble             none
      #@TestResult                Success if OpenDS returns 0
    -->
    <block name="STAXCurrentFunction">
      <sequence>
        <script>
          CurrentTestPath['suite']= 'dummy'
        </script>
        <testcase name="getTestCaseName(STAXCurrentFunction)">
          <sequence>
            <call function="'testCase_Preamble'" />
            <tcstatus result="'fail'" />
            <call function="'testCase_Postamble'" />
          </sequence>
        </testcase>
      </sequence>
    </block>
  </function>

  <!-- the dummy inconclusive test -->
  <function name="inconclusive_test">
    <!---
      Place test-specific test information here.
      The tag, TestMarker, must be the same as the tag, TestSuiteName.
      #@TestMarker                Sample
      #@TestName                  passing_test
      #@TestIssue                 xyz
      #@TestPurpose               Illustrate how to issue a query on OpenDS
      #@TestPreamble              none
      #@TestStep                  Fetch all the entries in the server
      #@TestPostamble             none
      #@TestResult                Success if OpenDS returns 0
    -->
    <block name="STAXCurrentFunction">
      <sequence>
        <script>
          CurrentTestPath['suite']= 'dummy'
        </script>
        <testcase name="getTestCaseName(STAXCurrentFunction)">
          <sequence>
            <call function="'testCase_Preamble'" />
            <call function="'testCase_Postamble'" />
          </sequence>
        </testcase>
      </sequence>
    </block>
  </function>
  <!-- the dummy passing test -->
  <function name="passing_test">
    <!---
      Place test-specific test information here.
      The tag, TestMarker, must be the same as the tag, TestSuiteName.
      #@TestMarker                Sample
      #@TestName                  passing_test
      #@TestIssue                 xyz
      #@TestPurpose               Illustrate how to issue a query on OpenDS
      #@TestPreamble              none
      #@TestStep                  Fetch all the entries in the server
      #@TestPostamble             none
      #@TestResult                Success if OpenDS returns 0
    -->
    <block name="STAXCurrentFunction">
      <sequence>
        <script>
          CurrentTestPath['suite']= 'dummy'
        </script>
        <testcase name="getTestCaseName(STAXCurrentFunction)">
          <sequence>
            <call function="'testCase_Preamble'" />
            <tcstatus result="'pass'" />
            <call function="'testCase_Postamble'" />
          </sequence>
        </testcase>
      </sequence>
    </block>
  </function>
  
  <!-- Setup the instance for sample test -->
  <function name="sample_setup">
    <sequence>
      <call function="'runFunction'">
        { 'functionName'      : 'createTopology'                              ,
          'functionMessage'   : 'Create DS topology as described in config.py',
          'functionException' : 'Topology.CreationException'                  ,
          'functionArguments' : { 'initialiseInstance' : True }
        }
      </call>
      <call function="'runFunction'">
        { 'functionName'      : 'StartDsWithScript'                                      ,
          'functionMessage'   : 'Start DS to run on port %s' % (DIRECTORY_INSTANCE_PORT) ,
          'functionArguments' : { 'location' : STAF_REMOTE_HOSTNAME }
        }
      </call>
      <call function="'runFunction'">
        { 'functionName'      : 'isAlive'                             ,
          'functionMessage'   : 'Checking if the server is available' ,
          'functionException' : 'Topology.StartException'             ,
          'functionArguments' : { 'noOfLoops'        : 10    ,
                                  'noOfMilliSeconds' : 2000 }
        }
      </call>
    </sequence>
  </function>
  
  <!-- cleanup after the test -->
  <function name="sample_cleanup">
    <sequence>
      <call function="'runFunction'">
        { 'functionName'      : 'StopDsWithScript' ,
          'functionMessage'   : 'Stop DS running on port %s' % (DIRECTORY_INSTANCE_PORT),
          'functionArguments' : { 'location'    : STAF_REMOTE_HOSTNAME    ,
                                  'dsHost'      : DIRECTORY_INSTANCE_HOST ,
                                  'dsAdminPort' : DIRECTORY_INSTANCE_ADMIN_PORT ,
                                  'dsBindDN'    : DIRECTORY_INSTANCE_DN   ,
                                  'dsBindPwd'   : DIRECTORY_INSTANCE_PSWD }
        }
      </call>
      <call function="'runFunction'">
        { 'functionName'    : 'removeTopology',
          'functionMessage' : 'Remove DS topology created for the Test Suite'
        }
      </call>
    </sequence>
  </function>
  
</stax>
