message statistics added

Signed-off-by: eantwuh <antal.wu-hen-chang@ericsson.com>
diff --git a/src/EPTF_MQTT_LGen_Definitions.ttcn b/src/EPTF_MQTT_LGen_Definitions.ttcn
index f452981..735e042 100644
--- a/src/EPTF_MQTT_LGen_Definitions.ttcn
+++ b/src/EPTF_MQTT_LGen_Definitions.ttcn
@@ -1048,8 +1048,108 @@
   ///////////////////////////////////////////////////////////  
   type function fcb_EPTF_MQTT_messageReceived(in EPTF_MQTT_PDU pl_message) runs on self;
 
+ /*****************************************************************
+   @startuml EPTF_MQTT_LGen_Definitions.EPTF_MQTT_LGen_Statistics.jpg
+   class EPTF_MQTT_LGen_Statistics {
+    integer   noPublishTimeouts
+    integer   noSubscribeTimeouts
+    integer   noPublishSuccess
+    EPTF_MQTT_Message_Statistics incoming
+    EPTF_MQTT_Message_Statistics outgoing
+   }
+   @enduml
+  ******************************************************************/
+  ///////////////////////////////////////////////////////////
+  //  Type: EPTF_MQTT_LGen_Statistics
+  //
+  //  Purpose:
+  //    Storing counters for load generator related statistics
+  //
+  //  Class:
+  //    (see EPTF_MQTT_LGen_Definitions.EPTF_MQTT_LGen_Statistics.jpg)
+  //
+  //  Elements:
+  //    noPublishTimeouts - *integer* - number of publish transaction timeouts
+  //    noSubscribeTimeouts - *integer* - number of subscribe transaction timeouts
+  //    noPublishSuccess - *integer* - number of succesful publish transactions
+  //    incoming - <EPTF_MQTT_Message_Statistics> - statistics of incoming messages
+  //    outgoing - <EPTF_MQTT_Message_Statistics> - statistics of outgoing messages
+  ///////////////////////////////////////////////////////////  
+  type record EPTF_MQTT_LGen_Statistics
+  {
+    integer noPublishTimeouts,
+    integer noSubscribeTimeouts,
+    integer noPublishSuccess,
+    EPTF_MQTT_Message_Statistics incoming,
+    EPTF_MQTT_Message_Statistics outgoing
+  }
+  
+  const EPTF_MQTT_LGen_Statistics c_EPTF_MQTT_LGen_Statistics_empty :=
+  {
+    noPublishTimeouts := 0,
+    noSubscribeTimeouts := 0,
+    noPublishSuccess := 0,
+    incoming := c_EPTF_MQTT_Message_Statistics_empty,
+    outgoing := c_EPTF_MQTT_Message_Statistics_empty
+  }
 
-
+  ///////////////////////////////////////////////////////////
+  //  Type: EPTF_MQTT_Message_Statistics
+  //
+  //  Purpose:
+  //    Storing counters for message related statistics
+  //
+  //  Elements:
+  //    noCONNECT  - *integer* - number of CONNECT messages
+  //    noCONNACK - *integer* number of CONNACK messages
+  //    noPUBLISH - *integer* number of PUBLISH messages
+  //    noPUBACK - *integer* number of PUBACK messages
+  //    noPUBREC - *integer* number of PUBREC messages
+  //    noPUBREL - *integer* number of PUBREL messages
+  //    noPUBCOMP - *integer* number of PUBCOMP messages
+  //    noSUBSCRIBE - *integer* number of SUBSCRIBE messages
+  //    noSUBACK - *integer* number of SUBACK messages
+  //    noUNSUBSCRIBE - *integer* number of UNSUBSCRIBE messages
+  //    noUNSUBACK - *integer* number of UNSUBACK messages
+  //    noPINGREQ - *integer* number of PINGREQ messages
+  //    noPINGRESP - *integer* number of PINGRESP messages
+  //    noDISCONNECT - *integer* number of DISCONNECT messages
+  /////////////////////////////////////////////////////////// 
+  type record EPTF_MQTT_Message_Statistics
+  {
+    integer noCONNECT,
+    integer noCONNACK,
+    integer noPUBLISH,
+    integer noPUBACK,
+    integer noPUBREC,
+    integer noPUBREL,
+    integer noPUBCOMP,
+    integer noSUBSCRIBE,
+    integer noSUBACK,
+    integer noUNSUBSCRIBE,
+    integer noUNSUBACK,
+    integer noPINGREQ,
+    integer noPINGRESP,
+    integer noDISCONNECT
+  }
+  
+  const EPTF_MQTT_Message_Statistics c_EPTF_MQTT_Message_Statistics_empty :=
+  {
+    noCONNECT := 0,
+    noCONNACK := 0,
+    noPUBLISH := 0,
+    noPUBACK := 0,
+    noPUBREC := 0,
+    noPUBREL := 0,
+    noPUBCOMP := 0,
+    noSUBSCRIBE := 0,
+    noSUBACK := 0,
+    noUNSUBSCRIBE := 0,
+    noUNSUBACK := 0,
+    noPINGREQ := 0,
+    noPINGRESP := 0,
+    noDISCONNECT := 0
+  }
 
   /*****************************************************************
    @startuml EPTF_MQTT_LGen_Definitions.EPTF_MQTT_LGen_CT.jpg
@@ -1124,6 +1224,7 @@
   //
   //   v_MQTT_msgToProcess - <EPTF_MQTT_PDU> - message to process
   //   v_MQTT_msgToSend - <EPTF_MQTT_PDU> - message to send
+  //   v_MQTT_stats - <EPTF_MQTT_LGen_Statistics> - MQTT message statistics
   //
   //
   //   vf_MQTT_msgReceived - <fcb_EPTF_MQTT_messageReceived> - Function hook for reporting received messages
@@ -1169,7 +1270,7 @@
     var MQTT_Template_DB    	v_MQTT_templateDB;
     var MQTT_Session_DB     	v_MQTT_sessionDB;
     var MQTT_Subscription_DB	v_MQTT_subscriptionDB;
-    var MQTT_Publish_DB			v_MQTT_publishDB;
+    var MQTT_Publish_DB		v_MQTT_publishDB;
 
     var MQTT_StepCtx 		v_MQTT_ctx := c_MQTT_StepCtx_empty;
     var MQTT_Session 		v_MQTT_session := c_MQTT_Session_init;
@@ -1178,6 +1279,8 @@
 
     var EPTF_MQTT_PDU v_MQTT_msgToProcess;
     var EPTF_MQTT_PDU v_MQTT_msgToSend;
+    
+    var EPTF_MQTT_LGen_Statistics v_MQTT_stats := c_EPTF_MQTT_LGen_Statistics_empty;
 
     var fcb_EPTF_MQTT_messageReceived vf_MQTT_msgReceived := null;
   }
diff --git a/src/EPTF_MQTT_LGen_Functions.ttcn b/src/EPTF_MQTT_LGen_Functions.ttcn
index 1c06cfd..699e602 100644
--- a/src/EPTF_MQTT_LGen_Functions.ttcn
+++ b/src/EPTF_MQTT_LGen_Functions.ttcn
@@ -321,6 +321,8 @@
     f_EPTF_MQTT_Logging_VERBOSE(log2str(%definitionId, " ", pl_message));
 
     v_MQTT_msgToProcess := pl_message;
+    
+    f_EPTF_MQTT_updateMessageStatistics(v_MQTT_stats.incoming, pl_message);
 
     f_EPTF_MQTT_stack_fromEnv(v_MQTT_msgToProcess);
 
@@ -419,6 +421,8 @@
   function f_EPTF_MQTT_LGen_send(inout EPTF_MQTT_PDU p_msg)
   runs on EPTF_MQTT_LGen_CT
   {
+    f_EPTF_MQTT_updateMessageStatistics(v_MQTT_stats.outgoing, p_msg);
+    
     vf_EPTF_MQTT_Transport_send.apply(p_msg);
   }
 
@@ -3305,6 +3309,8 @@
   {
     var integer vl_pIdx := pl_action.actionId[0];
     v_MQTT_subscriptionDB.data[vl_pIdx].watchdogTimer := -1;
+    
+    v_MQTT_stats.noSubscribeTimeouts := v_MQTT_stats.noSubscribeTimeouts + 1;
 
     f_EPTF_MQTT_dispatchEvent(
       c_MQTT_eventIdx_SUBSCRIBE_Timeout,
@@ -3579,6 +3585,7 @@
           f_EPTF_MQTT_publish_setState(p_pubIdx, { qos1:=ACKNOWLEDGED });
 
           // remove publish transaction
+	  v_MQTT_stats.noPublishSuccess := v_MQTT_stats.noPublishSuccess + 1;
           f_EPTF_MQTT_publish_remove(p_pubIdx);
         }
         else { f_EPTF_MQTT_Logging_WARNING(log2str(%definitionId, " Message not handled. Ignoring:", p_msg)); }
@@ -3646,6 +3653,7 @@
           }
 
           // remove publish transaction
+	  v_MQTT_stats.noPublishSuccess := v_MQTT_stats.noPublishSuccess + 1;
           f_EPTF_MQTT_publish_remove(p_pubIdx);
         }
         else { f_EPTF_MQTT_Logging_WARNING(log2str(%definitionId, " Message not handled. Ignoring:", p_msg)); }
@@ -3707,6 +3715,7 @@
           f_EPTF_MQTT_publish_setState(p_pubIdx, { qos2:=COMPLETE });
 
           // remove publish transaction
+	  v_MQTT_stats.noPublishSuccess := v_MQTT_stats.noPublishSuccess + 1;
           f_EPTF_MQTT_publish_remove(p_pubIdx);
         }
         else { f_EPTF_MQTT_Logging_WARNING(log2str(%definitionId, " Message not handled. Ignoring:", p_msg)); }
@@ -3741,6 +3750,8 @@
   {
     var integer vl_pIdx := pl_action.actionId[0];
     v_MQTT_publishDB.data[vl_pIdx].watchdogTimer := -1;
+    
+    v_MQTT_stats.noPublishTimeouts := v_MQTT_stats.noPublishTimeouts + 1;
 
     f_EPTF_MQTT_dispatchEvent(
       c_MQTT_eventIdx_PUBLISH_Timeout,
@@ -4217,6 +4228,23 @@
     }
   }
 
+  function f_EPTF_MQTT_updateMessageStatistics(inout EPTF_MQTT_Message_Statistics p_stats, in EPTF_MQTT_PDU p_pdu)
+  {
+    if (ischosen(p_pdu.pdu.connect_msg)) { p_stats.noCONNECT := p_stats.noCONNECT + 1; }
+    else if (ischosen(p_pdu.pdu.publish)) { p_stats.noPUBLISH := p_stats.noPUBLISH + 1; }
+    else if (ischosen(p_pdu.pdu.puback)) { p_stats.noPUBACK := p_stats.noPUBACK + 1; }
+    else if (ischosen(p_pdu.pdu.pubrec)) { p_stats.noPUBREC := p_stats.noPUBREC + 1; }
+    else if (ischosen(p_pdu.pdu.pubrel)) { p_stats.noPUBREL := p_stats.noPUBREL + 1; }
+    else if (ischosen(p_pdu.pdu.pubcomp)) { p_stats.noPUBCOMP := p_stats.noPUBCOMP + 1; }
+    else if (ischosen(p_pdu.pdu.subscribe)) { p_stats.noSUBSCRIBE := p_stats.noSUBSCRIBE + 1; }
+    else if (ischosen(p_pdu.pdu.suback)) { p_stats.noSUBACK := p_stats.noSUBACK + 1; }
+    else if (ischosen(p_pdu.pdu.unsubscribe)) { p_stats.noUNSUBSCRIBE := p_stats.noUNSUBSCRIBE + 1; }
+    else if (ischosen(p_pdu.pdu.unsuback)) { p_stats.noUNSUBACK := p_stats.noUNSUBACK + 1; }
+    else if (ischosen(p_pdu.pdu.pingreq)) { p_stats.noPINGREQ := p_stats.noPINGREQ + 1; }
+    else if (ischosen(p_pdu.pdu.pingresp)) { p_stats.noPINGRESP := p_stats.noPINGRESP + 1; }
+    else if (ischosen(p_pdu.pdu.disconnect_msg)) { p_stats.noDISCONNECT := p_stats.noDISCONNECT + 1; }
+  }
+
   template MQTT_v3_1_1_ReqResp t_EPTF_MQTT_pingReq :=
   {
     pingreq := {