The language for specifying tests contains the following main constructs:
The nodes in a test specification are executed sequentially as they are encountered.
Tag substitution is performed before the node is evaluated. Tag substitution refers to the substitution of ##{<value name>} with the content of the named value. The named value can come from two sources:
<message_publish name="[<name>]" channel="[<channel name>]"> <message_builder command="[java|shell]:[<command id>]" template_path="[<path to a template>]"> <param>[<command parameter 1>]</param> <param>[<command parameter 2>]</param> ... </message_builder> </message_publish>
Build a message from a template and publish it to the «OutgoingOrder» channel:
<message_publish name="PublishOrder" channel="OutgoingOrder"> <message_builder command="java:org.mactor.extensions.xml.XPathTemplateMessageBuilder" template_path="templates/order.xml"> <param>Header/MessageId=##{MessageId}</param> <param>Data/OrderId=##{OrderId}</param> </message_builder> </message_publish>
Similar using the template without modifications:
<message_publish name="PublishOrder" channel="OutgoingOrder"> <message_builder command="java:org.mactor.extensions.xml.XPathTemplateMessageBuilder" template_path="templates/order.xml"/> </message_publish>
Using a system executable to build a message:
<message_publish name="PublishOrder" channel="OutgoingOrder"> <message_builder command="shell:my_message_producer.sh" /> </message_publish>
<message_subscribe name="[<name>]" channel="[<channel name>]"> <message_selector command="[java]:[<command id>]"> <param>[<command parameter 1>]</param> <param>[<command parameter 2>]</param> ... </message_selector> </message_subscribe>
Subscribe to messages coming in on the «IncomingOrderStatus» channel. Only messages acceptet by the message_selector command is passed on:
<message_subscribe name="OrderStatus" channel="IncomingOrderStatus"> <message_selector command="java:org.mactor.extensions.xml.BasicMessageSelector"> <param>Header/CorrelationId=##{MessageId}</param> </message_selector> </message_subscribe>
<message_receive name="[<name>]" message_subscribe_node_name="[<name if the subscribe node>]" max_message_count="[<count>]" min_message_count="[<count>]" max_timeout_seconds="[<seconds>]" block_until_timeout="true|false"/>
Receive exactly one message using a previously defined message subscribe node named «SubscribeForOrderStatus»:
<message_receive name="ReceiveOrderStatus" message_subscribe_node_name="SubscribeForOrderStatus" max_message_count="1" min_message_count="1" max_timeout_seconds="600" block_until_timeout="false"/>
Receive 10 messages, perform an action (described later) and send a response message (also described later) for each for the received messages :
<message_receive name="ReceiveOrder" message_subscribe_node_name="SubscribeForOrder" max_message_count="10" min_message_count="10" max_timeout_seconds="600" block_until_timeout="false"> <action name="ValidateOrder" command="java:org.mactor.extensions.xml.XPathIgnoreNsValidator"> <param>//StatsId==1</param> <param>//ProductId==##{ExpectedProductId}</param> </action> <message_respond name="SendOrderResponse" > <message_builder command="java:org.mactor.extensions.xml.XPathTemplateMessageBuilder" template_path="templates/order_soap_reponse_envelope.xml"> <param>Data/OrderId=##{OrderId}</param> </message_builder> </message_publish> </message_receive>
A message_respond node enables the sending of a synchronous response to a received message. A message_respond node can only be used within a message_receive node. The message_respond node must typically be used while dealing with synchronous message transfer protocols (i.e. such as SOAP)
<message_respond name="[<name>]" > <message_builder command="[java|shell]:[<command id>]" template_path="[<path to a template>]"> <param>[<command parameter 1>]</param> <param>[<command parameter 2>]</param> ... </message_builder> </message_respond>
Build a message from a template and publish it to the «OutgoingOrder» channel:
<message_respond name="SendOrderResponse" > <message_builder command="java:org.mactor.extensions.xml.XPathTemplateMessageBuilder" template_path="templates/order_soap_reponse_envelope.xml"> <param>Data/OrderId=##{OrderId}</param> </message_builder> </message_publish>
<action name="[<name>]" command="[java|shell|sql]:[<command id>]"> <param>[<command parameter 1>]</param> <param>[<command parameter 2>]</param> ... </action>
Assert that the parameter is not null (if the value named «OrderId» is null, the command will throw an exeption and the test will fail):
<action name="ValidateOrderExist" command="java:org.mactor.extensions.AssertNotNullValidator"> <param>##{OrderId}</param> </action>
Assert that the internet connection is up (ping will give an exit value other than 0 if the destination cannot be reached and the test will fail):
<action name="CheckInternetConnection" command="shell:ping -n 1 -w 200 vg.no"/>
Run a sql expression:
<action name="DeleteOrder" command="sql:order_db:delete order where id=##{OrderId}"/> Assuming that the global config file contains definition of order_db. I.e: <global_config xmlns="http://schemas.mactor.org/framework" max_test_threads="15"> <group name="order_db"> <value name="driver">oracle.jdbc.driver.OracleDriver</value> <value name="url">jdbc:oracle:thin:@12.12.12.12:2121</value> <value name="username">lars</value> <value name="password">abc</value> </group> </global_config>
Run a sql expression:
<action name="InitDb" command="sql:order_db:init_db.sql"/>
<value name="[<name>]" command="[java|shell|sql]:[<command id>]"> <param>[<command parameter 1>]</param> <param>[<command parameter 2>]</param> ... </value>
Initialize the varible named «CurrentTime» with the current time:
<value name="CurrentTime" command="java:org.mactor.extensions.CurrentTimeExtractor"/>
Initialize the varible named «MessageId1» with the next value in the sequence named «msgid» (starting at 200):
<value name="MessageId1" command="sequence:msgid"> <param>200</param> </value>
Initialize the varible named «MessageId2» with the next value in the sequence named «msgid»:
<value name="MessageId2" command="sequence:msgid"/>
Initialize the varible named «DbOrderStatus» with the result of the database query:
<value name="DbOrderStatus" command="sql:order_db:=select status from order where id='##{OrderId}'"/> Assuming that a config group named «order_db» is defined in the global config file, and that the «OrderId» value is defined
Initialize the variable named «OrderId» with field from the last received message:
<value name="OrderId" command="java:org.mactor.extensions.xml.XPathIgnoreNsValueExtractor"> <param>//OrderId</param> </value> Assuming that the last received message contains an element matching the //OrderId XPath
<loop name="[<name>]" count="[<the number for times to loop>]"> ... </loop>
Publish 100 orders:
<loop name="MainLoop" count="100"> <message_publish name="PublishOrderStatus" channel="OutgoingOrderStatus"> <message_builder command="java:org.mactor.extensions.xml.XPathTemplateMessageBuilder" template_path="templates/order_status.xml"/> </message_publish> </loop>
Receive 1000 orders, and publish an OrderStatus for each of the:
<message_subscribe name="SubscribeForOrder" channel="IncomingOrder"> <message_selector command="java:org.mactor.extensions.xml.XPathIgnoreNsMessageSelector"></message_selector> </message_subscribe> <loop name="MainLoop" count="10000"> <message_receive name="ReceiveOrder" message_subscribe_node_name="SubscribeForOrder" max_message_count="1" min_message_count="1" max_timeout_seconds="10000" block_until_timeout="true"></message_receive> <value name="MessageId" command="sequence:msgid"> <param>999000</param> </value> <value name="CorrelationId" command="java:org.mactor.extensions.xml.XPathIgnoreNsValueExtractor"> <param>//Header/MessageId</param> </value> <message_publish name="PublishOrderStatus" channel="OutgoingOrderStatus"> <message_builder command="java:org.mactor.extensions.xml.XPathTemplateMessageBuilder" template_path="templates/order_status.xml"> <param>//Header/MessageId==##{MessageId}</param> <param>//Header/CorrelationId==##{CorrelationId}</param> <param>//Status==0</param> </message_builder> </message_publish> </loop>