<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<workflow-app xmlns="uri:oozie:workflow:0.1" name="test-wf">

    <start to="a"/>

    <action name="a">
        <test xmlns="uri:test">
            <signal-value>${wf:conf('signal-value')}</signal-value>
            <external-status>${wf:conf('external-status')}</external-status>
            <error>${wf:conf('error')}</error>
            <avoid-set-execution-data>${wf:conf('avoid-set-execution-data')}</avoid-set-execution-data>
            <avoid-set-end-data>${wf:conf('avoid-set-end-data')}</avoid-set-end-data>
            <running-mode>${wf:conf('running-mode')}</running-mode>
        </test>
        <ok to="end"/>
        <error to="kill"/>
    </action>

    <kill name="kill">
        <!-- the message purposefully has an EL syntax error -->
        <message>${{wf:user()}</message>
    </kill>

    <end name="end"/>

</workflow-app>
