diff --git a/regression_test/realtime/Makefile b/regression_test/realtime/Makefile index ae33679d11629f8f9a360c10e3c47a0590441743..dc08e16ac25439d1598d9ac2263e365ae314ee0d 100644 --- a/regression_test/realtime/Makefile +++ b/regression_test/realtime/Makefile @@ -15,13 +15,14 @@ include $(TOPDIR)/Makefile.regression .SUFFIXES: .ttcn .hh .PHONY: all clean dep run +# activate real-time testing features COMPILER_FLAGS += -I TTCN3_LIB = ttcn3$(RT2_SUFFIX)-parallel$(DYNAMIC_SUFFIX) -TTCN3_MODULES = realtimeNow.ttcn realtimeTimestamp.ttcn +TTCN3_MODULES = realtimeNow.ttcn realtimeTimestamp.ttcn realtimeTimestampPortTranslation.ttcn realtimeTimestampAnyFrom.ttcn -USER_SOURCES = PortMsg.cc PortProc.cc +USER_SOURCES = PortMsg.cc PortProc.cc PortProvBasic.cc PortProvRT.cc PortTransBasic.cc PortTransRT.cc GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc) GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh) @@ -52,7 +53,7 @@ compile: $(TTCN3_MODULES) clean distclean: -rm -f $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \ - $(GENERATED_SOURCES) *.log Makefile.bak compile + $(GENERATED_SOURCES) logs/*.log Makefile.bak compile dep: $(GENERATED_SOURCES) makedepend $(CPPFLAGS) $(GENERATED_SOURCES) diff --git a/regression_test/realtime/PortMsg.cc b/regression_test/realtime/PortMsg.cc index 2ad6a9025acbd3cdc82cba8746a2fdfd16a3c2ca..e2db005946182d326a927e383145094b454c853c 100644 --- a/regression_test/realtime/PortMsg.cc +++ b/regression_test/realtime/PortMsg.cc @@ -11,13 +11,13 @@ namespace realtimeTimestamp { -void ef__incoming__message(const INTEGER& p__msg, const BOOLEAN& p__set__timestamp) +void ef__incoming__message(PortMsg& p__pt, const INTEGER& p__msg, const BOOLEAN& p__set__timestamp) { if (p__set__timestamp) { - CT_component_ptMsg.incoming_message(p__msg, TTCN_Runtime::now()); + p__pt.incoming_message(p__msg, TTCN_Runtime::now()); } else { - CT_component_ptMsg.incoming_message(p__msg); + p__pt.incoming_message(p__msg); } } diff --git a/regression_test/realtime/PortMsg.hh b/regression_test/realtime/PortMsg.hh index 0ebda47303fe9c3e6d6a0280a58f635392c776bf..ecb7f937e3f88b3379a755c6178f6c6114b20284 100644 --- a/regression_test/realtime/PortMsg.hh +++ b/regression_test/realtime/PortMsg.hh @@ -15,7 +15,7 @@ namespace realtimeTimestamp { class PortMsg : public PortMsg_BASE { - friend void ef__incoming__message(const INTEGER& p__msg, const BOOLEAN& p__set__timestamp); + friend void ef__incoming__message(PortMsg& p__pt, const INTEGER& p__msg, const BOOLEAN& p__set__timestamp); public: PortMsg(const char *par_port_name = NULL); ~PortMsg(); diff --git a/regression_test/realtime/PortProc.cc b/regression_test/realtime/PortProc.cc index 51cef686f7d1fe20d85a023a930a19ec7059357e..8e35b2c7ab19f0249a41f631595d15d7b31af40a 100644 --- a/regression_test/realtime/PortProc.cc +++ b/regression_test/realtime/PortProc.cc @@ -11,38 +11,38 @@ namespace realtimeTimestamp { -void ef__incoming__call(const INTEGER& p__par, const BOOLEAN& p__set__timestamp) +void ef__incoming__call(PortProc& p__pt, const INTEGER& p__par, const BOOLEAN& p__set__timestamp) { Sig_call x; x.p() = p__par; if (p__set__timestamp) { - CT_component_ptProc.incoming_call(x, TTCN_Runtime::now()); + p__pt.incoming_call(x, TTCN_Runtime::now()); } else { - CT_component_ptProc.incoming_call(x); + p__pt.incoming_call(x); } } -void ef__incoming__reply(const INTEGER& p__par, const CHARSTRING& p__ret, const BOOLEAN& p__set__timestamp) +void ef__incoming__reply(PortProc& p__pt, const INTEGER& p__par, const CHARSTRING& p__ret, const BOOLEAN& p__set__timestamp) { Sig_reply x; x.p() = p__par; x.return_value() = p__ret; if (p__set__timestamp) { - CT_component_ptProc.incoming_reply(x, TTCN_Runtime::now()); + p__pt.incoming_reply(x, TTCN_Runtime::now()); } else { - CT_component_ptProc.incoming_reply(x); + p__pt.incoming_reply(x); } } -void ef__incoming__exception(const BOOLEAN& p__ex, const BOOLEAN& p__set__timestamp) +void ef__incoming__exception(PortProc& p__pt, const BOOLEAN& p__ex, const BOOLEAN& p__set__timestamp) { if (p__set__timestamp) { - CT_component_ptProc.incoming_exception(Sig_exception(p__ex), TTCN_Runtime::now()); + p__pt.incoming_exception(Sig_exception(p__ex), TTCN_Runtime::now()); } else { - CT_component_ptProc.incoming_exception(Sig_exception(p__ex)); + p__pt.incoming_exception(Sig_exception(p__ex)); } } diff --git a/regression_test/realtime/PortProc.hh b/regression_test/realtime/PortProc.hh index e3e9c8911fa33897530f63b454483f64710c0f5b..345e5893c94087ccee12cac43f01afe896a146ec 100644 --- a/regression_test/realtime/PortProc.hh +++ b/regression_test/realtime/PortProc.hh @@ -15,9 +15,9 @@ namespace realtimeTimestamp { class PortProc : public PortProc_BASE { - friend void ef__incoming__call(const INTEGER& p__par, const BOOLEAN& p__set__timestamp); - friend void ef__incoming__reply(const INTEGER& p__par, const CHARSTRING& p__ret, const BOOLEAN& p__set__timestamp); - friend void ef__incoming__exception(const BOOLEAN& p__ex, const BOOLEAN& p__set__timestamp); + friend void ef__incoming__call(PortProc& p__pt, const INTEGER& p__par, const BOOLEAN& p__set__timestamp); + friend void ef__incoming__reply(PortProc& p__pt, const INTEGER& p__par, const CHARSTRING& p__ret, const BOOLEAN& p__set__timestamp); + friend void ef__incoming__exception(PortProc& p__pt, const BOOLEAN& p__ex, const BOOLEAN& p__set__timestamp); public: PortProc(const char *par_port_name = NULL); ~PortProc(); diff --git a/regression_test/realtime/PortProvBasic.cc b/regression_test/realtime/PortProvBasic.cc new file mode 100644 index 0000000000000000000000000000000000000000..f5e4e381113216629d7a96623fd55855b23fed06 --- /dev/null +++ b/regression_test/realtime/PortProvBasic.cc @@ -0,0 +1,79 @@ +// This Test Port skeleton source file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/6 R4C +// for ebotbar (ebotbar@ebotbarVB) on Wed Nov 28 12:07:59 2018 + +// Copyright (c) 2000-2018 Ericsson Telecom AB + +// You may modify this file. Complete the body of empty functions and +// add your member functions here. + +#include "PortProvBasic.hh" +#include "realtimeTimestampPortTranslation.hh" + +namespace realtimeTimestampPortTranslation { + +PortProvBasic_PROVIDER::PortProvBasic_PROVIDER(const char *par_port_name) + : PORT(par_port_name) +{ + +} + +PortProvBasic_PROVIDER::~PortProvBasic_PROVIDER() +{ + +} + +void PortProvBasic_PROVIDER::set_parameter(const char * /*parameter_name*/, + const char * /*parameter_value*/) +{ + +} + +/*void PortProvBasic_PROVIDER::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + +void PortProvBasic_PROVIDER::Handle_Fd_Event_Error(int /*fd*/) +{ + +} + +void PortProvBasic_PROVIDER::Handle_Fd_Event_Writable(int /*fd*/) +{ + +} + +void PortProvBasic_PROVIDER::Handle_Fd_Event_Readable(int /*fd*/) +{ + +} + +/*void PortProvBasic_PROVIDER::Handle_Timeout(double time_since_last_call) {}*/ + +void PortProvBasic_PROVIDER::user_map(const char * /*system_port*/) +{ + +} + +void PortProvBasic_PROVIDER::user_unmap(const char * /*system_port*/) +{ + +} + +void PortProvBasic_PROVIDER::user_start() +{ + +} + +void PortProvBasic_PROVIDER::user_stop() +{ + +} + +void PortProvBasic_PROVIDER::outgoing_send(const INTEGER& send_par) +{ + // redirect the message to the port's input + incoming_message(send_par); +} + +} /* end of namespace */ + diff --git a/regression_test/realtime/PortProvBasic.hh b/regression_test/realtime/PortProvBasic.hh new file mode 100644 index 0000000000000000000000000000000000000000..ea2299de3f867461fc77a502058cf2de5570e836 --- /dev/null +++ b/regression_test/realtime/PortProvBasic.hh @@ -0,0 +1,49 @@ +// This Test Port skeleton header file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/6 R4C +// for ebotbar (ebotbar@ebotbarVB) on Wed Nov 28 12:07:59 2018 + +// Copyright (c) 2000-2018 Ericsson Telecom AB + +// You may modify this file. Add your attributes and prototypes of your +// member functions here. + +#ifndef PortProvBasic_HH +#define PortProvBasic_HH + +#include <TTCN3.hh> + +// Note: Header file realtimeTimestampPortTranslation.hh must not be included into this file! +// (because it includes this file) +// Please add the declarations of message types manually. + +namespace realtimeTimestampPortTranslation { + +class PortProvBasic_PROVIDER : public PORT { +public: + PortProvBasic_PROVIDER(const char *par_port_name); + ~PortProvBasic_PROVIDER(); + + void set_parameter(const char *parameter_name, + const char *parameter_value); + +private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ +protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + void outgoing_send(const INTEGER& send_par); + virtual void incoming_message(const INTEGER& incoming_par) = 0; +}; + +} /* end of namespace */ + +#endif diff --git a/regression_test/realtime/PortProvRT.cc b/regression_test/realtime/PortProvRT.cc new file mode 100644 index 0000000000000000000000000000000000000000..a242278d53fe159a0b9336cd3c1a223da8d2ab6d --- /dev/null +++ b/regression_test/realtime/PortProvRT.cc @@ -0,0 +1,82 @@ +// This Test Port skeleton source file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/6 R4C +// for ebotbar (ebotbar@ebotbarVB) on Wed Nov 28 12:07:59 2018 + +// Copyright (c) 2000-2018 Ericsson Telecom AB + +// You may modify this file. Complete the body of empty functions and +// add your member functions here. + +#include "PortProvRT.hh" +#include "realtimeTimestampPortTranslation.hh" + +namespace realtimeTimestampPortTranslation { + +PortProvRT_PROVIDER::PortProvRT_PROVIDER(const char *par_port_name) + : PORT(par_port_name) +{ + +} + +PortProvRT_PROVIDER::~PortProvRT_PROVIDER() +{ + +} + +void PortProvRT_PROVIDER::set_parameter(const char * /*parameter_name*/, + const char * /*parameter_value*/) +{ + +} + +/*void PortProvRT_PROVIDER::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + +void PortProvRT_PROVIDER::Handle_Fd_Event_Error(int /*fd*/) +{ + +} + +void PortProvRT_PROVIDER::Handle_Fd_Event_Writable(int /*fd*/) +{ + +} + +void PortProvRT_PROVIDER::Handle_Fd_Event_Readable(int /*fd*/) +{ + +} + +/*void PortProvRT_PROVIDER::Handle_Timeout(double time_since_last_call) {}*/ + +void PortProvRT_PROVIDER::user_map(const char * /*system_port*/) +{ + +} + +void PortProvRT_PROVIDER::user_unmap(const char * /*system_port*/) +{ + +} + +void PortProvRT_PROVIDER::user_start() +{ + +} + +void PortProvRT_PROVIDER::user_stop() +{ + +} + +void PortProvRT_PROVIDER::outgoing_send(const INTEGER& send_par, FLOAT* timestamp_redirect) +{ + if (timestamp_redirect != NULL) { + *timestamp_redirect = TTCN_Runtime::now(); + } + // redirect the message to the port's input + incoming_message(send_par, TTCN_Runtime::now()); +} + +} /* end of namespace */ + diff --git a/regression_test/realtime/PortProvRT.hh b/regression_test/realtime/PortProvRT.hh new file mode 100644 index 0000000000000000000000000000000000000000..35e6b04b969774bcc25392c1acb1109ed238739b --- /dev/null +++ b/regression_test/realtime/PortProvRT.hh @@ -0,0 +1,49 @@ +// This Test Port skeleton header file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/6 R4C +// for ebotbar (ebotbar@ebotbarVB) on Wed Nov 28 12:07:59 2018 + +// Copyright (c) 2000-2018 Ericsson Telecom AB + +// You may modify this file. Add your attributes and prototypes of your +// member functions here. + +#ifndef PortProvRT_HH +#define PortProvRT_HH + +#include <TTCN3.hh> + +// Note: Header file realtimeTimestampPortTranslation.hh must not be included into this file! +// (because it includes this file) +// Please add the declarations of message types manually. + +namespace realtimeTimestampPortTranslation { + +class PortProvRT_PROVIDER : public PORT { +public: + PortProvRT_PROVIDER(const char *par_port_name); + ~PortProvRT_PROVIDER(); + + void set_parameter(const char *parameter_name, + const char *parameter_value); + +private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ +protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + void outgoing_send(const INTEGER& send_par, FLOAT* timestamp_redirect); + virtual void incoming_message(const INTEGER& incoming_par, const FLOAT& timestamp = FLOAT()) = 0; +}; + +} /* end of namespace */ + +#endif diff --git a/regression_test/realtime/PortTransBasic.cc b/regression_test/realtime/PortTransBasic.cc new file mode 100644 index 0000000000000000000000000000000000000000..a53edcb20550ca30368a116a9eb4869001b0fec3 --- /dev/null +++ b/regression_test/realtime/PortTransBasic.cc @@ -0,0 +1,77 @@ +// This Test Port skeleton source file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/6 R4C +// for ebotbar (ebotbar@ebotbarVB) on Wed Nov 28 12:07:59 2018 + +// Copyright (c) 2000-2018 Ericsson Telecom AB + +// You may modify this file. Complete the body of empty functions and +// add your member functions here. + +#include "PortTransBasic.hh" + +namespace realtimeTimestampPortTranslation { + +PortTransBasic::PortTransBasic(const char *par_port_name) + : PortTransBasic_BASE(par_port_name) +{ + +} + +PortTransBasic::~PortTransBasic() +{ + +} + +void PortTransBasic::set_parameter(const char * /*parameter_name*/, + const char * /*parameter_value*/) +{ + +} + +/*void PortTransBasic::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + +void PortTransBasic::Handle_Fd_Event_Error(int /*fd*/) +{ + +} + +void PortTransBasic::Handle_Fd_Event_Writable(int /*fd*/) +{ + +} + +void PortTransBasic::Handle_Fd_Event_Readable(int /*fd*/) +{ + +} + +/*void PortTransBasic::Handle_Timeout(double time_since_last_call) {}*/ + +void PortTransBasic::user_map(const char * /*system_port*/) +{ + +} + +void PortTransBasic::user_unmap(const char * /*system_port*/) +{ + +} + +void PortTransBasic::user_start() +{ + +} + +void PortTransBasic::user_stop() +{ + +} + +void PortTransBasic::outgoing_send(const OCTETSTRING& /*send_par*/) +{ + +} + +} /* end of namespace */ + diff --git a/regression_test/realtime/PortTransBasic.hh b/regression_test/realtime/PortTransBasic.hh new file mode 100644 index 0000000000000000000000000000000000000000..0b688fa30ff1660da2a9f5b0d6c13e286f0359b1 --- /dev/null +++ b/regression_test/realtime/PortTransBasic.hh @@ -0,0 +1,44 @@ +// This Test Port skeleton header file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/6 R4C +// for ebotbar (ebotbar@ebotbarVB) on Wed Nov 28 12:07:59 2018 + +// Copyright (c) 2000-2018 Ericsson Telecom AB + +// You may modify this file. Add your attributes and prototypes of your +// member functions here. + +#ifndef PortTransBasic_HH +#define PortTransBasic_HH + +#include "realtimeTimestampPortTranslation.hh" + +namespace realtimeTimestampPortTranslation { + +class PortTransBasic : public PortTransBasic_BASE { +public: + PortTransBasic(const char *par_port_name = NULL); + ~PortTransBasic(); + + void set_parameter(const char *parameter_name, + const char *parameter_value); + +private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ +protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + void outgoing_send(const OCTETSTRING& send_par); +}; + +} /* end of namespace */ + +#endif diff --git a/regression_test/realtime/PortTransRT.cc b/regression_test/realtime/PortTransRT.cc new file mode 100644 index 0000000000000000000000000000000000000000..d69a0f034f2c6fd9a227b5879136f2fdac50ccb9 --- /dev/null +++ b/regression_test/realtime/PortTransRT.cc @@ -0,0 +1,81 @@ +// This Test Port skeleton source file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/6 R4C +// for ebotbar (ebotbar@ebotbarVB) on Wed Nov 28 12:07:59 2018 + +// Copyright (c) 2000-2018 Ericsson Telecom AB + +// You may modify this file. Complete the body of empty functions and +// add your member functions here. + +#include "PortTransRT.hh" + +namespace realtimeTimestampPortTranslation { + +PortTransRT::PortTransRT(const char *par_port_name) + : PortTransRT_BASE(par_port_name) +{ + +} + +PortTransRT::~PortTransRT() +{ + +} + +void PortTransRT::set_parameter(const char * /*parameter_name*/, + const char * /*parameter_value*/) +{ + +} + +/*void PortTransRT::Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error) {}*/ + +void PortTransRT::Handle_Fd_Event_Error(int /*fd*/) +{ + +} + +void PortTransRT::Handle_Fd_Event_Writable(int /*fd*/) +{ + +} + +void PortTransRT::Handle_Fd_Event_Readable(int /*fd*/) +{ + +} + +/*void PortTransRT::Handle_Timeout(double time_since_last_call) {}*/ + +void PortTransRT::user_map(const char * /*system_port*/) +{ + +} + +void PortTransRT::user_unmap(const char * /*system_port*/) +{ + +} + +void PortTransRT::user_start() +{ + +} + +void PortTransRT::user_stop() +{ + +} + +void PortTransRT::outgoing_send(const OCTETSTRING& send_par, FLOAT* timestamp_redirect) +{ + if (timestamp_redirect != NULL) { + *timestamp_redirect = TTCN_Runtime::now(); + } + // redirect the message to the port's input + incoming_message(oct2str(send_par), TTCN_Runtime::now()); +} + +} /* end of namespace */ + diff --git a/regression_test/realtime/PortTransRT.hh b/regression_test/realtime/PortTransRT.hh new file mode 100644 index 0000000000000000000000000000000000000000..08fdd3df065aefb694d0ac26ab5684259dfe3429 --- /dev/null +++ b/regression_test/realtime/PortTransRT.hh @@ -0,0 +1,44 @@ +// This Test Port skeleton header file was generated by the +// TTCN-3 Compiler of the TTCN-3 Test Executor version CRL 113 200/6 R4C +// for ebotbar (ebotbar@ebotbarVB) on Wed Nov 28 12:07:59 2018 + +// Copyright (c) 2000-2018 Ericsson Telecom AB + +// You may modify this file. Add your attributes and prototypes of your +// member functions here. + +#ifndef PortTransRT_HH +#define PortTransRT_HH + +#include "realtimeTimestampPortTranslation.hh" + +namespace realtimeTimestampPortTranslation { + +class PortTransRT : public PortTransRT_BASE { +public: + PortTransRT(const char *par_port_name = NULL); + ~PortTransRT(); + + void set_parameter(const char *parameter_name, + const char *parameter_value); + +private: + /* void Handle_Fd_Event(int fd, boolean is_readable, + boolean is_writable, boolean is_error); */ + void Handle_Fd_Event_Error(int fd); + void Handle_Fd_Event_Writable(int fd); + void Handle_Fd_Event_Readable(int fd); + /* void Handle_Timeout(double time_since_last_call); */ +protected: + void user_map(const char *system_port); + void user_unmap(const char *system_port); + + void user_start(); + void user_stop(); + + void outgoing_send(const OCTETSTRING& send_par, FLOAT* timestamp_redirect); +}; + +} /* end of namespace */ + +#endif diff --git a/regression_test/realtime/config.cfg b/regression_test/realtime/config.cfg index 9228015fe28e53f8563f83a5b21de46986ae0e9f..1ff31230205e4a6c25d8c3e573daff1d5b78ee6a 100644 --- a/regression_test/realtime/config.cfg +++ b/regression_test/realtime/config.cfg @@ -10,10 +10,12 @@ # ############################################################################### [LOGGING] -LogFile := "realtime_%r.log" +LogFile := "logs/realtime_%r.log" FileMask := LOG_ALL ConsoleMask := TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS [EXECUTE] realtimeNow realtimeTimestamp +realtimeTimestampAnyFrom +realtimeTimestampPortTranslation diff --git a/regression_test/realtime/realtimeTimestamp.ttcn b/regression_test/realtime/realtimeTimestamp.ttcn index e585bf0717ead9039264f0fd9d6c75e481e28f0c..66de4b957e3fc3d66ad8a2580e623a34092cde6b 100644 --- a/regression_test/realtime/realtimeTimestamp.ttcn +++ b/regression_test/realtime/realtimeTimestamp.ttcn @@ -37,10 +37,10 @@ type enumerated IncomingOperation { type enumerated OutgoingOperation { Send, Call, Reply, Raise } -external function ef_incoming_message(in integer p_msg, in boolean p_set_timestamp); -external function ef_incoming_call(in integer p_par, in boolean p_set_timestamp); -external function ef_incoming_reply(in integer p_par, in charstring p_ret, in boolean p_set_timestamp); -external function ef_incoming_exception(in boolean p_ex, in boolean p_set_timestamp); +external function ef_incoming_message(PortMsg p_pt, in integer p_msg, in boolean p_set_timestamp); +external function ef_incoming_call(PortProc p_pt, in integer p_par, in boolean p_set_timestamp); +external function ef_incoming_reply(PortProc p_pt, in integer p_par, in charstring p_ret, in boolean p_set_timestamp); +external function ef_incoming_exception(PortProc p_pt, in boolean p_ex, in boolean p_set_timestamp); ///////////////////////////////////////////////////////////////////////// ///////////// Test function for all incoming operations ///////////////// @@ -54,16 +54,16 @@ function f_test_timestamp_inc_op(in IncomingOperation p_operation, in boolean p_ // and either set or don't set the timestamp) select (p_operation) { case (Receive, CheckReceive, Trigger, Check) { - ef_incoming_message(5, p_set_timestamp); + ef_incoming_message(ptMsg, 5, p_set_timestamp); } case (Getcall, CheckGetcall) { - ef_incoming_call(5, p_set_timestamp); + ef_incoming_call(ptProc, 5, p_set_timestamp); } case (Getreply, CheckGetreply) { - ef_incoming_reply(5, "x", p_set_timestamp); + ef_incoming_reply(ptProc, 5, "x", p_set_timestamp); } case (Catch, CheckCatch) { - ef_incoming_exception(true, p_set_timestamp); + ef_incoming_exception(ptProc, true, p_set_timestamp); } } @@ -106,7 +106,7 @@ function f_test_timestamp_inc_op(in IncomingOperation p_operation, in boolean p_ time_after := now; if (p_set_timestamp) { if (time_before > time_operation or time_operation > time_after) { - setverdict(fail, "Incorrect times measured. Before: ", time_before, ", check-catch: ", time_operation, ", after: ", time_after, "."); + setverdict(fail, "Incorrect times measured. Before: ", time_before, ", operation: ", time_operation, ", after: ", time_after, "."); } } else if (isbound(time_operation)) { @@ -147,7 +147,7 @@ function f_test_timestamp_outg_op(in OutgoingOperation p_operation, in boolean p time_after := now; if (p_set_timestamp) { if (time_before > time_operation or time_operation > time_after) { - setverdict(fail, "Incorrect times measured. Before: ", time_before, ", check-catch: ", time_operation, ", after: ", time_after, "."); + setverdict(fail, "Incorrect times measured. Before: ", time_before, ", operation: ", time_operation, ", after: ", time_after, "."); } } else if (isbound(time_operation)) { diff --git a/regression_test/realtime/realtimeTimestampAnyFrom.ttcn b/regression_test/realtime/realtimeTimestampAnyFrom.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..c8d72d7ca47ff510c50358acf2ece8d97f67392d --- /dev/null +++ b/regression_test/realtime/realtimeTimestampAnyFrom.ttcn @@ -0,0 +1,337 @@ +/****************************************************************************** + * Copyright (c) 2000-2018 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html + * + * Contributors: + * Baranyi, Botond + * + ******************************************************************************/ + +// This module tests timestamp redirects for real-time port operations in the 'any from' clause +module realtimeTimestampAnyFrom { + +import from realtimeTimestamp all; + +type component CT2 { + port PortMsg ptaMsg[2][3]; + port PortProc ptaProc[3]; +} + +function f_map_ports() runs on CT2 { + for (var integer i := 0; i < sizeof(ptaMsg); i := i + 1) { + for (var integer j := 0; j < sizeof(ptaMsg[i]); j := j + 1) { + map(self:ptaMsg[i][j], system:ptaMsg[i][j]); + } + } + for (var integer k := 0; k < sizeof(ptaProc); k := k + 1) { + map(self:ptaProc[k], system:ptaProc[k]); + } +} + +///////////////////////////////////////////////////////////////////////// +///////////// Test function for all incoming operations ///////////////// +///////////////////////////////////////////////////////////////////////// + +function f_test_timestamp_any_from(in IncomingOperation p_operation, in boolean p_set_timestamp) runs on CT2 { + f_map_ports(); + var float time_before := now, time_operation, time_after; + + // initiate the specified operation through an external function + // (these simulate the arrival of a message/call/reply/exception from the system component, + // and either set or don't set the timestamp) + select (p_operation) { + case (Receive, CheckReceive, Trigger, Check) { + ef_incoming_message(ptaMsg[0][2], 5, p_set_timestamp); + } + case (Getcall, CheckGetcall) { + ef_incoming_call(ptaProc[1], 5, p_set_timestamp); + } + case (Getreply, CheckGetreply) { + ef_incoming_reply(ptaProc[1], 5, "x", p_set_timestamp); + } + case (Catch, CheckCatch) { + ef_incoming_exception(ptaProc[1], true, p_set_timestamp); + } + } + + // start a timer (just in case) + timer t := 0.5; + t.start; + alt { + [p_operation == Receive ] any from ptaMsg.receive(integer: ?) -> timestamp time_operation { } + [p_operation == CheckReceive ] any from ptaMsg.check(receive(integer: ?) -> timestamp time_operation) { } + [p_operation == Trigger ] any from ptaMsg.trigger(integer: ?) -> timestamp time_operation { } + [p_operation == Getcall ] any from ptaProc.getcall(Sig: { ? }) -> timestamp time_operation { } + [p_operation == CheckGetcall ] any from ptaProc.check(getcall(Sig: { ? }) -> timestamp time_operation) { } + [p_operation == Getreply ] any from ptaProc.getreply(Sig: { ? } value charstring: ?) -> timestamp time_operation { } + [p_operation == CheckGetreply] any from ptaProc.check(getreply(Sig: { ? } value charstring: ?) -> timestamp time_operation) { } + [p_operation == Catch ] any from ptaProc.catch(Sig, boolean: ?) -> timestamp time_operation { } + [p_operation == CheckCatch ] any from ptaProc.check(catch(Sig, boolean: ?) -> timestamp time_operation) { } + [p_operation == Check ] any from ptaMsg.check(-> timestamp time_operation) { } + [] t.timeout { setverdict(fail, "Operation timed out."); } + } + + // check results + time_after := now; + if (p_set_timestamp) { + if (time_before > time_operation or time_operation > time_after) { + setverdict(fail, "Incorrect times measured. Before: ", time_before, ", operation: ", time_operation, ", after: ", time_after, "."); + } + } + else if (isbound(time_operation)) { + setverdict(fail, "Timestamp was supposed to be unset."); + } + setverdict(pass); +} + +///////////////////////////////////////////////////////////////////////// +////////////////////////// Test cases /////////////////////////////////// +///////////////////////////////////////////////////////////////////////// + +testcase tc_timestamp_any_from_receive_mtc() runs on CT2 { + f_test_timestamp_any_from(Receive, true); +} + +testcase tc_timestamp_any_from_receive_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Receive, true)); + ct.done; +} + +testcase tc_timestamp_any_from_check_receive_mtc() runs on CT2 { + f_test_timestamp_any_from(CheckReceive, true); +} + +testcase tc_timestamp_any_from_check_receive_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(CheckReceive, true)); + ct.done; +} + +testcase tc_timestamp_any_from_trigger_mtc() runs on CT2 { + f_test_timestamp_any_from(Trigger, true); +} + +testcase tc_timestamp_any_from_trigger_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Trigger, true)); + ct.done; +} + +testcase tc_timestamp_any_from_getcall_mtc() runs on CT2 { + f_test_timestamp_any_from(Getcall, true); +} + +testcase tc_timestamp_any_from_getcall_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Getcall, true)); + ct.done; +} + +testcase tc_timestamp_any_from_check_getcall_mtc() runs on CT2 { + f_test_timestamp_any_from(CheckGetcall, true); +} + +testcase tc_timestamp_any_from_check_getcall_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(CheckGetcall, true)); + ct.done; +} + +testcase tc_timestamp_any_from_getreply_mtc() runs on CT2 { + f_test_timestamp_any_from(Getreply, true); +} + +testcase tc_timestamp_any_from_getreply_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Getreply, true)); + ct.done; +} + +testcase tc_timestamp_any_from_check_getreply_mtc() runs on CT2 { + f_test_timestamp_any_from(CheckGetreply, true); +} + +testcase tc_timestamp_any_from_check_getreply_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(CheckGetreply, true)); + ct.done; +} + +testcase tc_timestamp_any_from_catch_mtc() runs on CT2 { + f_test_timestamp_any_from(Catch, true); +} + +testcase tc_timestamp_any_from_catch_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Catch, true)); + ct.done; +} + +testcase tc_timestamp_any_from_check_catch_mtc() runs on CT2 { + f_test_timestamp_any_from(CheckCatch, true); +} + +testcase tc_timestamp_any_from_check_catch_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(CheckCatch, true)); + ct.done; +} + +testcase tc_timestamp_any_from_check_mtc() runs on CT2 { + f_test_timestamp_any_from(Check, true); +} + +testcase tc_timestamp_any_from_check_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Check, true)); + ct.done; +} + +testcase tc_no_timestamp_any_from_receive_mtc() runs on CT2 { + f_test_timestamp_any_from(Receive, false); +} + +testcase tc_no_timestamp_any_from_receive_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Receive, false)); + ct.done; +} + +testcase tc_no_timestamp_any_from_check_receive_mtc() runs on CT2 { + f_test_timestamp_any_from(CheckReceive, false); +} + +testcase tc_no_timestamp_any_from_check_receive_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(CheckReceive, false)); + ct.done; +} + +testcase tc_no_timestamp_any_from_trigger_mtc() runs on CT2 { + f_test_timestamp_any_from(Trigger, false); +} + +testcase tc_no_timestamp_any_from_trigger_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Trigger, false)); + ct.done; +} + +testcase tc_no_timestamp_any_from_getcall_mtc() runs on CT2 { + f_test_timestamp_any_from(Getcall, false); +} + +testcase tc_no_timestamp_any_from_getcall_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Getcall, false)); + ct.done; +} + +testcase tc_no_timestamp_any_from_check_getcall_mtc() runs on CT2 { + f_test_timestamp_any_from(CheckGetcall, false); +} + +testcase tc_no_timestamp_any_from_check_getcall_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(CheckGetcall, false)); + ct.done; +} + +testcase tc_no_timestamp_any_from_getreply_mtc() runs on CT2 { + f_test_timestamp_any_from(Getreply, false); +} + +testcase tc_no_timestamp_any_from_getreply_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Getreply, false)); + ct.done; +} + +testcase tc_no_timestamp_any_from_check_getreply_mtc() runs on CT2 { + f_test_timestamp_any_from(CheckGetreply, false); +} + +testcase tc_no_timestamp_any_from_check_getreply_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(CheckGetreply, false)); + ct.done; +} + +testcase tc_no_timestamp_any_from_catch_mtc() runs on CT2 { + f_test_timestamp_any_from(Catch, false); +} + +testcase tc_no_timestamp_any_from_catch_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Catch, false)); + ct.done; +} + +testcase tc_no_timestamp_any_from_check_catch_mtc() runs on CT2 { + f_test_timestamp_any_from(CheckCatch, false); +} + +testcase tc_no_timestamp_any_from_check_catch_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(CheckCatch, false)); + ct.done; +} + +testcase tc_no_timestamp_any_from_check_mtc() runs on CT2 { + f_test_timestamp_any_from(Check, false); +} + +testcase tc_no_timestamp_any_from_check_ptc() runs on CT2 { + var CT2 ct := CT2.create; + ct.start(f_test_timestamp_any_from(Check, false)); + ct.done; +} + +control { + execute(tc_timestamp_any_from_receive_mtc()); + execute(tc_timestamp_any_from_receive_ptc()); + execute(tc_timestamp_any_from_check_receive_mtc()); + execute(tc_timestamp_any_from_check_receive_ptc()); + execute(tc_timestamp_any_from_trigger_mtc()); + execute(tc_timestamp_any_from_trigger_ptc()); + execute(tc_timestamp_any_from_getcall_mtc()); + execute(tc_timestamp_any_from_getcall_ptc()); + execute(tc_timestamp_any_from_check_getcall_mtc()); + execute(tc_timestamp_any_from_check_getcall_ptc()); + execute(tc_timestamp_any_from_getreply_mtc()); + execute(tc_timestamp_any_from_getreply_ptc()); + execute(tc_timestamp_any_from_check_getreply_mtc()); + execute(tc_timestamp_any_from_check_getreply_ptc()); + execute(tc_timestamp_any_from_catch_mtc()); + execute(tc_timestamp_any_from_catch_ptc()); + execute(tc_timestamp_any_from_check_catch_mtc()); + execute(tc_timestamp_any_from_check_catch_ptc()); + execute(tc_timestamp_any_from_check_mtc()); + execute(tc_timestamp_any_from_check_ptc()); + execute(tc_no_timestamp_any_from_receive_mtc()); + execute(tc_no_timestamp_any_from_receive_ptc()); + execute(tc_no_timestamp_any_from_check_receive_mtc()); + execute(tc_no_timestamp_any_from_check_receive_ptc()); + execute(tc_no_timestamp_any_from_trigger_mtc()); + execute(tc_no_timestamp_any_from_trigger_ptc()); + execute(tc_no_timestamp_any_from_getcall_mtc()); + execute(tc_no_timestamp_any_from_getcall_ptc()); + execute(tc_no_timestamp_any_from_check_getcall_mtc()); + execute(tc_no_timestamp_any_from_check_getcall_ptc()); + execute(tc_no_timestamp_any_from_getreply_mtc()); + execute(tc_no_timestamp_any_from_getreply_ptc()); + execute(tc_no_timestamp_any_from_check_getreply_mtc()); + execute(tc_no_timestamp_any_from_check_getreply_ptc()); + execute(tc_no_timestamp_any_from_catch_mtc()); + execute(tc_no_timestamp_any_from_catch_ptc()); + execute(tc_no_timestamp_any_from_check_catch_mtc()); + execute(tc_no_timestamp_any_from_check_catch_ptc()); + execute(tc_no_timestamp_any_from_check_mtc()); + execute(tc_no_timestamp_any_from_check_ptc()); +} + +} diff --git a/regression_test/realtime/realtimeTimestampPortTranslation.ttcn b/regression_test/realtime/realtimeTimestampPortTranslation.ttcn new file mode 100644 index 0000000000000000000000000000000000000000..8a2fe596179eecc2b37855c238defbc74a9fbbab --- /dev/null +++ b/regression_test/realtime/realtimeTimestampPortTranslation.ttcn @@ -0,0 +1,248 @@ +/****************************************************************************** + * Copyright (c) 2000-2018 Ericsson Telecom AB + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html + * + * Contributors: + * Baranyi, Botond + * + ******************************************************************************/ + +// This module tests timestamp redirects for real-time port operations on translation ports +module realtimeTimestampPortTranslation { + +///////////////////////////////////////////////////////////////////////// +//////////////////// Port translation functions ///////////////////////// +///////////////////////////////////////////////////////////////////////// + +function int_2_char(in integer x, out charstring y) port PortTransRT { + y := int2str(x); + port.setstate(0); +} +with { + extension "prototype(fast)"; +} + +const octetstring SPECIAL_WITH_TIMESTAMP := 'DEADBEEF'O; +const octetstring SPECIAL_WITH_NO_TIMESTAMP := '0123ABCD'O; + +function oct_2_int(in octetstring x, out integer y) port PortTransRT { + if (x == SPECIAL_WITH_TIMESTAMP or x == SPECIAL_WITH_NO_TIMESTAMP) { + // special case: + // test timestamp redirects in a translation function + var float time_before := now, time_send, time_receive, time_after; + + // the port's output is redirected to its input (so this will trigger an incoming message) + port.send('AB'O) -> timestamp time_send; + + alt { + [] port.receive(charstring: ?) -> timestamp time_receive { } + } + + // check results + time_after := now; + if (x == SPECIAL_WITH_TIMESTAMP) { + if (time_before > time_send or time_send > time_receive or time_receive > time_after) { + setverdict(fail, "Incorrect times measured. Before: ", time_before, ", send: ", time_send, ", receive: ", time_receive, ", after: ", time_after, "."); + } + } + else if (isbound(time_send) or isbound(time_receive)) { + setverdict(fail, "Timestamps were supposed to be unset."); + } + setverdict(pass); + y := 0; + } + else { + y := oct2int(x); + } + port.setstate(0); +} +with { + extension "prototype(fast)"; +} + +function int_2_char_dummy(in integer x, out charstring y) port PortTransBasic { + port.setstate(0); +} +with { + extension "prototype(fast)"; +} + +function oct_2_int_dummy(in octetstring x, out integer y) port PortTransBasic { + port.setstate(0); +} +with { + extension "prototype(fast)"; +} + +///////////////////////////////////////////////////////////////////////// +////////////////////// Port and component types ///////////////////////// +///////////////////////////////////////////////////////////////////////// + +type port PortProvRT message realtime { + inout integer +} +with { + extension "provider"; +} + +type port PortProvBasic message { + inout integer +} +with { + extension "provider"; +} + +type port PortTransRT message realtime map to PortProvRT, PortProvBasic { + in charstring from integer with int_2_char() + out octetstring to integer with oct_2_int() +} + +type port PortTransBasic message map to PortProvRT, PortProvBasic { + in charstring from integer with int_2_char_dummy() + out octetstring to integer with oct_2_int_dummy() +} + +type component CT_Provider { + port PortProvRT ptProvRT; + port PortProvBasic ptProvB; +} + +type component CT_User { + port PortTransRT ptTransRT; + port PortTransBasic ptTransB; +} + +///////////////////////////////////////////////////////////////////////// +/////////////////////////// Test functions ////////////////////////////// +///////////////////////////////////////////////////////////////////////// + +function f_test_timestamp_port_trans(in boolean p_set_timestamp) runs on CT_User { + var float time_before := now, time_send, time_receive, time_after; + + // the port's output is redirected to its input (so this will trigger an incoming message) + ptTransRT.send('03'O) -> timestamp time_send; + + alt { + [] ptTransRT.receive(charstring: ?) -> timestamp time_receive { } + } + + // check results + time_after := now; + if (p_set_timestamp) { + if (time_before > time_send or time_send > time_receive or time_receive > time_after) { + setverdict(fail, "Incorrect times measured. Before: ", time_before, ", send: ", time_send, ", receive: ", time_receive, ", after: ", time_after, "."); + } + } + else if (isbound(time_send) or isbound(time_receive)) { + setverdict(fail, "Timestamps were supposed to be unset."); + } + setverdict(pass); +} + +function f_test_timestamp_in_trans_func(in boolean p_set_timestamp) runs on CT_User { + if (p_set_timestamp) { + ptTransRT.send(SPECIAL_WITH_TIMESTAMP); + } + else { + ptTransRT.send(SPECIAL_WITH_NO_TIMESTAMP); + } +} + +///////////////////////////////////////////////////////////////////////// +////////////////////////////// Testcases //////////////////////////////// +///////////////////////////////////////////////////////////////////////// + +testcase tc_timestamp_port_trans_RT_provider_mtc() runs on CT_User system CT_Provider { + // mapped with runtime provider port => timestamps should be set + map(mtc:ptTransRT, system:ptProvRT); + f_test_timestamp_port_trans(true); +} + +testcase tc_timestamp_port_trans_RT_provider_ptc() runs on CT_User system CT_Provider { + var CT_User ct := CT_User.create; + // mapped with runtime provider port => timestamps should be set + map(ct:ptTransRT, system:ptProvRT); + ct.start(f_test_timestamp_port_trans(true)); + ct.done; +} + +testcase tc_timestamp_port_trans_nonRT_provider_mtc() runs on CT_User system CT_Provider { + // mapped with non-runtime provider port => timestamps shouldn't be set + map(mtc:ptTransRT, system:ptProvB); + f_test_timestamp_port_trans(false); +} + +testcase tc_timestamp_port_trans_nonRT_provider_ptc() runs on CT_User system CT_Provider { + var CT_User ct := CT_User.create; + // mapped with non-runtime provider port => timestamps shouldn't be set + map(ct:ptTransRT, system:ptProvB); + ct.start(f_test_timestamp_port_trans(false)); + ct.done; +} + +testcase tc_timestamp_port_trans_no_provider_mtc() runs on CT_User system CT_User { + // not mapped in translation mode => timestamps should be set + map(mtc:ptTransRT, system:ptTransRT); + f_test_timestamp_port_trans(true); +} + +testcase tc_timestamp_port_trans_no_provider_ptc() runs on CT_User system CT_User { + var CT_User ct := CT_User.create; + // not mapped in translation mode => timestamps should be set + map(ct:ptTransRT, system:ptTransRT); + ct.start(f_test_timestamp_port_trans(true)); + ct.done; +} + +testcase tc_cross_map() runs on CT_User system CT_Provider { + // testing whether a non-realtime translation port can be mapped to a realtime provider port + map(mtc:ptTransB, system:ptProvRT); + setverdict(pass); +} + +testcase tc_timestamp_in_port_trans_func_RT_provider_mtc() runs on CT_User system CT_Provider { + // mapped with runtime provider port => timestamps should be set + map(mtc:ptTransRT, system:ptProvRT); + f_test_timestamp_in_trans_func(true); +} + +testcase tc_timestamp_in_port_trans_func_RT_provider_ptc() runs on CT_User system CT_Provider { + var CT_User ct := CT_User.create; + // mapped with runtime provider port => timestamps should be set + map(ct:ptTransRT, system:ptProvRT); + ct.start(f_test_timestamp_in_trans_func(true)); + ct.done; +} + +testcase tc_timestamp_in_port_trans_func_nonRT_provider_mtc() runs on CT_User system CT_Provider { + // mapped with non-runtime provider port => timestamps shouldn't be set + map(mtc:ptTransRT, system:ptProvB); + f_test_timestamp_in_trans_func(false); +} + +testcase tc_timestamp_in_port_trans_func_nonRT_provider_ptc() runs on CT_User system CT_Provider { + var CT_User ct := CT_User.create; + // mapped with non-runtime provider port => timestamps shouldn't be set + map(ct:ptTransRT, system:ptProvB); + ct.start(f_test_timestamp_in_trans_func(false)); + ct.done; +} + +control { + execute(tc_timestamp_port_trans_RT_provider_mtc()); + execute(tc_timestamp_port_trans_RT_provider_ptc()); + execute(tc_timestamp_port_trans_nonRT_provider_mtc()); + execute(tc_timestamp_port_trans_nonRT_provider_ptc()); + execute(tc_timestamp_port_trans_no_provider_mtc()); + execute(tc_timestamp_port_trans_no_provider_ptc()); + execute(tc_cross_map()); + execute(tc_timestamp_in_port_trans_func_RT_provider_mtc()); + execute(tc_timestamp_in_port_trans_func_RT_provider_ptc()); + execute(tc_timestamp_in_port_trans_func_nonRT_provider_mtc()); + execute(tc_timestamp_in_port_trans_func_nonRT_provider_ptc()); +} + +}