VIRTUAL CALLBACK
System Testing Test Script Language.
C++ only.
The VIRTUAL keyword modifies the CALLBACK statement, allowing it to handle messages using C++ inheritance.
Syntax
VIRTUAL CALLBACK <message_type> : <msg> ON <commtype> : <id> [<n>]
END CALLBACK
Description
The CALLBACK instruction dynamically recalls message reception and adds a connection identifier value to a communication channel identifier.
<message_type> is a message type, previously declared with a C++ typedef statement. Syntax using <message_type> * is not allowed.
<msg> is the output parameter of <message_type> that must be a polymorphic C++ class, which means that it must contain at least one virtual method.
<commtype> is the type of communication used for reading messages.
<id> is the input connection parameter on which a message must be read.
Because a single VIRTUAL CALLBACK can read several message types, the implicit choice of a CALLBACK may be ambiguous. The following rules apply:
-
If a CALLBACK exists for a given <message type>, System Testing chooses it.
If not, and if the message type is actually a virtual class, then System Testing chooses the VIRTUAL CALLBACK with the closest type in terms of path in the inheritance diagram of <message_type>.
If more than one VIRTUAL CALLBACK can be chosen by following the above rules, the CALLBACK is ambiguous and System Testing produces an error.
Example
class high_level_message
{
public:
char from[12];
char applname[12];
virtual int get_type(){return 0;}
};
class ack : public high_level_message
{
public:
int get_type(){return ACK;}
};
class negack : public high_level_message
{
public:
int get_type(){return NEG_ACK;}
};
class data : public high_level_message
{
public:
char userdata[MAX_USERDATA_LENGTH];
int length;
int get_type(){return DATA;}
};
#typedef high_level_message * pt_ high_level_message;
VIRTUAL CALLBACK pt_ high_level_message: msg ON appl_comm: id
CALL get_message ( &id, &msg, 0 ) @@ errcode
MESSAGE_DATE
IF ( errcode == err_empty ) THEN
NO_MESSAGE
END IF
IF ( errcode != err_ok ) THEN
ERROR
END IF
END CALLBACK
This VIRTUAL CALLBACK allows you to read high_level_message, ack, negack and data message types, as shown on the following lines:
MESSAGE data : a_data
MESSAGE ack : my_ack
MESSAGE negack : my_neg_ack
MESSAGE high_level_message : hm
DEF_MESSAGE my_ack, EV={}
WAITTIL (MATCHING(my_ack), WTIME==300)
DEF_MESSAGE a_data, EV={}
WAITTIL (MATCHING(a_data), WTIME==300)
Related Topics
CALLBACK ... END CALLBACK | PROCSEND ... END PROCSEND | VIRTUAL PROCSEND | MESSAGE