/**
 *    @author   ETSI STF517
 *    @version  $URL$
 *              $Id$
 *    @desc     IVIM TP functions
 *
 */

module ItsIvim_TpFunctions {
    
    // LibCommon
    import from LibCommon_Sync all;
    import from LibCommon_VerdictControl all;
    import from LibCommon_Time all;
    import from LibCommon_BasicTypesAndValues all;
    
    // LibItsCommon
    import from LibItsCommon_Pixits all;
    import from LibItsCommon_Functions all;
    import from LibItsCommon_TypesAndValues all;
    
    // LibIts
    import from ITS_Container language "ASN.1:1997" all;
    import from IVIM_PDU_Descriptions language "ASN.1:1997" all;
    import from IVI language "ASN.1:1997" all;
    
    // LibItsIVIM
    import from LibItsIvim_TypesAndValues all;
    import from LibItsIvim_Templates all;
    import from LibItsIvim_TestSystem all;
    import from LibItsIvim_Functions all;
    import from LibItsIvim_Pics all;
    
    group iviMessageTransmission { 
        
        group iviMessageFormat {
            
            /**
             * @desc    TP Function for TC_IS_IVI_MSGF_BV_01
             */
            function f_IS_IVI_MSGF_BV_01() runs on ItsIvim {
                
                // Local variables
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader
                    ))) { 
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Expected IVIM received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);  
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: IVIM not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poDefault();
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_01
            
        } // End of group iviMessageFormat
        
        group iviEventGeneration {
            
            function f_IS_IVI_EVGN_BV_01() runs on ItsIvim {
                
                // Local variables
                var IviIdentificationNumber v_iviIdentificationNumber;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                        
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        v_iviIdentificationNumber
                    ))))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Successfully received IVIM. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received a IVIM with incorrect information. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_01
            
            function f_IS_IVI_EVGN_BV_02() runs on ItsIvim {
                
                // Local variables
                var template (value) UtIvimTriggerList v_utTriggers := {
                    m_utTriggerEvent(c_duration_2sec, f_getCurrentTime() - 1000 * c_duration_2sec, -/*, -, -*/),
                    m_utTriggerEvent(c_duration_4sec, f_getCurrentTime() - 1000 * c_duration_4sec, -/*, -, -*/),
                    m_utTriggerEvent(c_duration_6sec, f_getCurrentTime() - 1000 * c_duration_6sec, -/*, -, -*/)
                }
                var boolean v_success := true;
                var IviIdentificationNumberList v_iviIdentificationNumbers;
                var IvimInd v_ivimInd;
                var integer i;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                for (i := 0; i < lengthof(v_utTriggers) - 1; i := i + 1) {
                    f_utTriggerEvent(v_utTriggers[i]);
                    f_awaitIviMessage(mw_ivimInd(mw_anyIvimPdu), v_ivimInd);
                    v_iviIdentificationNumbers[i] := v_ivimInd.msgIn.ivi.mandatory.iviIdentificationNumber;
                }
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                f_utTriggerEvent(v_utTriggers[lengthof(v_utTriggers) - 1]);
                f_awaitIviMessage(mw_ivimInd(mw_anyIvimPdu), v_ivimInd);
                v_iviIdentificationNumbers[lengthof(v_iviIdentificationNumbers) - 1] := v_ivimInd.msgIn.ivi.mandatory.iviIdentificationNumber;
                
                //check the action id
                for (i := 0; i < lengthof(v_iviIdentificationNumbers) - 1; i := i + 1) {
                    if (v_iviIdentificationNumbers[lengthof(v_iviIdentificationNumbers) - 1] == v_iviIdentificationNumbers[i]) {
                        v_success := false;
                    }
                }
                if (v_success==true) {
                    log("*** " & testcasename() & ": PASS: IviIdentificationNumber field indicating unused value. ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                }
                else {
                    log("*** " & testcasename() & ": FAIL: IviIdentificationNumber field indicating used value. ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                }
                
                // Postamble
                for (i := 0; i < lengthof(v_iviIdentificationNumbers); i := i + 1) {
                    f_poCancelEvent(e_iut, v_iviIdentificationNumbers[i]);
                }
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_02
            
            function f_IS_IVI_EVGN_BV_03() runs on ItsIvim {
                
                // Local variables
                var template (value) UtIvimTriggerList v_utTriggers := {
                    m_utTriggerEvent(c_duration_2sec, f_getCurrentTime() - 1000 * c_duration_2sec, -/*, -, -*/),
                    m_utTriggerEvent(c_duration_4sec, f_getCurrentTime() - 1000 * c_duration_4sec, -/*, -, -*/),
                    m_utTriggerEvent(c_duration_6sec, f_getCurrentTime() - 1000 * c_duration_6sec, -/*, -, -*/)
                }
                var IviIdentificationNumber v_iviIdentificationNumber;
                var boolean v_success := true;
                var IvimInd v_ivimInd;
                var integer i;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                for (i := 0; i < lengthof(v_utTriggers) - 1; i := i + 1) {
                    f_utTriggerEvent(v_utTriggers[i]);
                    f_awaitIviMessage(mw_ivimInd(mw_anyIvimPdu), v_ivimInd);
                    f_poCancelEvent(e_iut, v_ivimInd.msgIn.ivi.mandatory.iviIdentificationNumber);
                }
                //save the last IVI identification number
                v_iviIdentificationNumber := v_ivimInd.msgIn.ivi.mandatory.iviIdentificationNumber;
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                f_utTriggerEvent(v_utTriggers[lengthof(v_utTriggers) - 1]);
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        v_iviIdentificationNumber + 1,
                                        IviStatus_new_
                    ))))) -> value v_ivimInd {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Successfully received expected IVIM. ***");
                        v_iviIdentificationNumber := v_ivimInd.msgIn.ivi.mandatory.iviIdentificationNumber;
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received a IVIM with incorrect information. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_03
            
            function f_IS_IVI_EVGN_BV_04() runs on ItsIvim {
                
                // Local variables
                var IviIdentificationNumber v_iviIdentificationNumber;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        v_iviIdentificationNumber, 
                                        IviStatus_new_
                    ))))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Successfully received expected IVIM. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received a IVIM with incorrect information. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_04
            
            function f_IS_IVI_EVGN_BV_05() runs on ItsIvim {
                
                // Local variables
                const integer c_epsilon := 500; // maximum c_epsilon cannot exceed 500ms 
                var IviIdentificationNumber v_iviIdentificationNumber;
                var TimestampIts v_timestamp;
                var IvimInd v_iviMsg;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                v_timestamp := f_getCurrentTime();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer_timestamp(
                                        -, 
                                        v_iviIdentificationNumber, 
                                        IviStatus_new_
                    ))))) -> value v_iviMsg {
                        tc_ac.stop;
                        if (f_abs(v_iviMsg.msgIn.ivi.mandatory.timeStamp - v_timestamp) < c_epsilon) {
                            log("*** " & testcasename() & ": PASS: Successfully received expected IVIM. ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        } else {
                            log("*** " & testcasename() & ": FAIL: TimeStamp value is out of range (" & int2str(c_epsilon) & "). ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received a IVIM with incorrect information. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_05
            
        } // End of group iviEventGeneration
        
        group iviEventUpdate {
            
            function f_IS_IVI_EVUP_BV_01() runs on ItsIvim {
                
                // Local variables
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                
                // Test control
                if (not PICS_IVIM_UPDATE) {
                    log("*** " & testcasename() & ": PICS_IVIM_UPDATE required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    -, 
                                    IviStatus_new_
                    )))),
                    v_rcvdMsg
                );
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                f_utUpdateEvent(m_utUpdateEvent(v_iviIdentificationNumber));
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        -, 
                                        IviStatus_update_
                    ))))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Successfully received expected IVIM. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received a IVIM with incorrect information. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_05
            
            function f_IS_IVI_EVUP_BV_02() runs on ItsIvim {
                
                // Local variables
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                var TimestampIts v_validTo;
                
                // Test control
                if (not PICS_IVIM_UPDATE) {
                    log("*** " & testcasename() & ": PICS_IVIM_UPDATE required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_new_
                    )))),
                    v_rcvdMsg
                );
                f_utUpdateEvent(m_utUpdateEvent(v_iviIdentificationNumber));
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_update_
                    )))),
                    v_rcvdMsg
                );
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                v_validTo := f_getCurrentTime() + 1000 * 3600; // Current ITS time + one hour
                f_utUpdateEvent(m_utUpdateEvent(v_iviIdentificationNumber, -, v_validTo));
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer_validTo(
                                        -, 
                                        v_iviIdentificationNumber, 
                                        IviStatus_update_,
                                        v_validTo
                    ))))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Successfully received expected IVIM. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received a IVIM with incorrect information. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_06
            
            function f_IS_IVI_EVUP_BV_03() runs on ItsIvim {
                
                // Local variables
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                var TimestampIts v_validFrom;
                
                // Test control
                if (not PICS_IVIM_UPDATE) {
                    log("*** " & testcasename() & ": PICS_IVIM_UPDATE required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_new_
                    )))),
                    v_rcvdMsg
                );
                f_utUpdateEvent(m_utUpdateEvent(v_iviIdentificationNumber));
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_update_
                    )))),
                    v_rcvdMsg
                );
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                v_validFrom := f_getCurrentTime() + 1000 * 3600; // Current ITS time + one hour
                f_utUpdateEvent(m_utUpdateEvent(v_iviIdentificationNumber, -, v_validFrom));
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer_validFrom(
                                        -, 
                                        v_iviIdentificationNumber, 
                                        IviStatus_update_,
                                        v_validFrom
                    ))))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Successfully received expected IVIM. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received a IVIM with incorrect information. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_07
            
            function f_IS_IVI_EVUP_BV_04() runs on ItsIvim {
                
                // Local variables
                const integer c_epsilon := 500; // maximum c_epsilon cannot exceed 500ms 
                var IviIdentificationNumber v_iviIdentificationNumber;
                var TimestampIts v_timestamp;
                var IvimInd v_rcvdMsg;
                
                // Test control
                if (not PICS_IVIM_UPDATE) {
                    log("*** " & testcasename() & ": PICS_IVIM_UPDATE required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_new_
                    )))),
                    v_rcvdMsg
                );
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                v_timestamp := f_getCurrentTime();
                f_utUpdateEvent(m_utUpdateEvent(v_iviIdentificationNumber));
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer_timestamp(
                                        -, 
                                        v_iviIdentificationNumber, 
                                        IviStatus_update_
                    ))))) -> value v_rcvdMsg {
                        tc_ac.stop;
                        if (f_abs(v_rcvdMsg.msgIn.ivi.mandatory.timeStamp - v_timestamp) < c_epsilon) {
                            log("*** " & testcasename() & ": PASS: Successfully received expected IVIM. ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        } else {
                            log("*** " & testcasename() & ": FAIL: TimeStamp value is out of range (" & int2str(c_epsilon) & "). ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received a IVIM with incorrect information. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_08
            
            function f_IS_IVI_EVUP_BV_05() runs on ItsIvim {
                
                // Local variables
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                
                // Test control
                if (not PICS_IVIM_UPDATE) {
                    log("*** " & testcasename() & ": PICS_IVIM_UPDATE required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_new_
                    )))),
                    v_rcvdMsg
                );
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                f_utUpdateEvent(m_utUpdateEvent(v_iviIdentificationNumber));
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        v_iviIdentificationNumber, 
                                        IviStatus_update_
                    ))))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Successfully received expected IVIM. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Received a IVIM with incorrect information. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IVIM_MSD_FMT_BV_09
            
        } // End of group iviEventUpdate
        
        group iviEventRepetition {
            
            function f_IS_IVI_EVRP_BV_01() runs on ItsIvim {
                
                // Local variables
                const integer c_maxLoopValue := 10;
                const TimestampIts c_repetitionInterval := c_duration_4sec;
                var integer v_counter := 0;
                var boolean v_ivimReceived := false;
                timer t_minTransInterval := int2float(c_repetitionInterval) * 0.90;
                timer t_maxTransInterval := int2float(c_repetitionInterval) * 1.10;
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                
                // Test control
                if (not PICS_IVIM_UPDATE) {
                    log("*** " & testcasename() & ": PICS_IVIM_UPDATE required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent(c_repetition_interval_deactivated));
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_new_
                    )))),
                    v_rcvdMsg
                );
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                f_utUpdateEvent(m_utUpdateEvent(v_iviIdentificationNumber, c_duration_4sec));
                
                tc_ac.start;
                ivimPort.clear;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        v_iviIdentificationNumber, 
                                        IviStatus_update_
                    ))))) {
                        tc_ac.stop;
                        v_ivimReceived := true;
                        tc_ac.start;
                    }
                    [] t_minTransInterval.timeout {
                        if (v_ivimReceived == true) {
                            log("*** " & testcasename() & ": FAIL: IVIM received BEFORE expiry of the minimum generation timer interval. ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        } else {
                            repeat;
                        }
                    }
                    [] t_maxTransInterval.timeout {
                        if (v_ivimReceived == false) {
                            log("*** " & testcasename() & ": FAIL: IVIM received AFTER expiry of the maximum generation timer interval. ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        } else {
                            v_counter := v_counter + 1;
                            if (v_counter < c_maxLoopValue) {
                                v_ivimReceived := false;
                                t_minTransInterval.start;
                                t_maxTransInterval.start;
                                repeat;
                            } else {
                                log("*** " & testcasename() & ": PASS: Generation of IVIMs was successful ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                            }
                        }
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IS_IVI_EVRP_BV_01
            
            function f_IS_IVI_EVRP_BV_02() runs on ItsIvim {
                
                // Local variables
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                
                // Test control
                if (not PICS_IVIM_UPDATE) {
                    log("*** " & testcasename() & ": PICS_IVIM_UPDATE required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_new_
                    )))),
                    v_rcvdMsg
                );
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                f_utUpdateEvent(m_utUpdateEvent(v_iviIdentificationNumber, c_repetition_interval_deactivated));
                
                ivimPort.clear;
                tc_noac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        v_iviIdentificationNumber, 
                                        IviStatus_update_
                    ))))) {
                        tc_noac.stop;
                        log("*** " & testcasename() & ": FAIL: No more IVIM shall be sent. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_noac.timeout {
                        log("*** " & testcasename() & ": PASS: No more IVIM was sent. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IS_IVI_EVRP_BV_02
            
        } // End of group iviEventRepetition
        
        group iviEventTermination {
            
            function f_IS_IVI_EVTR_BV_01() runs on ItsIvim {
                
                // Local variables
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent(c_repetition_interval_deactivated, -, f_getCurrentTime() + 1000 * c_duration_4sec));
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_new_
                    )))),
                    v_rcvdMsg
                );
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                f_sleep(int2float(f_getCurrentTime() + 1000 * c_duration_4sec));
                
                tc_noac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        v_iviIdentificationNumber,
                                        IviStatus_new_
                    ))))) {
                        log("*** " & testcasename() & ": INFO: No more IVIM shall be set. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_noac.timeout {
                        log("*** " & testcasename() & ": PASS: No more IVIM was sent. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                }
                
                // Postamble
                f_cfDown();
                
            } // End of function f_IS_IVI_EVTR_BV_01
            
            function f_IS_IVI_EVTR_BV_02() runs on ItsIvim {
                
                // Local variables
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                f_awaitIviMessage(
                    mw_ivimInd(
                        mw_anyIvimPdu(
                            mw_itsPduHeader,
                            mw_ivimStructure(
                                mw_iviManagementContainer(
                                    -, 
                                    v_iviIdentificationNumber, 
                                    IviStatus_new_
                    )))),
                    v_rcvdMsg
                );
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                f_utTerminateEvent(m_utEventCancellation(v_iviIdentificationNumber));
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        v_iviIdentificationNumber,
                                        IviStatus_new_
                    ))))) {
                        log("*** " & testcasename() & ": INFO: No more IVIM shall be set. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_noac.timeout {
                        log("*** " & testcasename() & ": PASS: No more IVIM was sent. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                }
                
                // Postamble
                f_cfDown();
                
            } // End of function f_IS_IVI_EVTR_BV_02
            
        } // End of group iviEventTermination
        
        group iviGenerationFrequency {
            
            function f_IS_IVI_GFQ_TI_01() runs on ItsIvim {
                
                // Local variables
                const integer c_maxLoopValue := 10;
                timer t_minTransInterval := PICS_T_GENIVIMMIN * 0.90;
                var integer v_counter := 0;
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent(float2int(PICS_T_GENIVIMMIN)));
                ivimPort.clear;
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        -, 
                                        IviStatus_new_
                    ))))) { 
                        tc_ac.stop;
                        t_minTransInterval.start;
                        log("*** " & testcasename() & ": INFO: Initial conditions: First IVIM received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Initial conditions: IVIM not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_timeout);
                    }
                }
                
                // Test Body
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer
                    )))) {
                        tc_ac.stop;
                        if (t_minTransInterval.running) {
                            log("*** " & testcasename() & ": FAIL: IVIM received BEFORE expiry of the minimum generation timer interval ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        } else {
                            v_counter := v_counter + 1;
                            if (v_counter < c_maxLoopValue) {
                                t_minTransInterval.start;
                                repeat;
                            } else {
                                log("*** " & testcasename() & ": PASS: Generation of IVIMs was successful ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                            }
                        }
                    }
                    [] t_minTransInterval.timeout {
                        repeat;
                    }
                    [] tc_ac.timeout {
                        t_minTransInterval.stop;
                        log("*** " & testcasename() & ": INCONC: IVIM not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IS_IVI_GFQ_TI_01
            
            function f_IS_IVI_GFQ_TI_02() runs on ItsIvim {
                
                // Local variables
                const integer c_maxLoopValue := 10;
                timer t_maxTransInterval := PICS_T_GENIVIMMAX * 1.10;
                var integer v_counter := 0;
                var IviIdentificationNumber v_iviIdentificationNumber;
                var IvimInd v_rcvdMsg;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent(float2int(PICS_T_GENIVIMMIN)));
                ivimPort.clear;
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer(
                                        -, 
                                        -, 
                                        IviStatus_new_
                    ))))) { 
                        tc_ac.stop;
                        t_maxTransInterval.start;
                        log("*** " & testcasename() & ": INFO: Initial conditions: First IVIM received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Initial conditions: IVIM not received ***");
                        f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_timeout);
                    }
                }
                
                // Test Body
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer
                    )))) {
                        tc_ac.stop;
                        t_maxTransInterval.stop;
                        t_maxTransInterval.start;
                        v_counter := v_counter + 1;
                        if (v_counter < c_maxLoopValue) {
                            t_maxTransInterval.start;
                            repeat;
                        } else {
                                log("*** " & testcasename() & ": PASS: Generation of IVIMs was successful ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    [] t_maxTransInterval.timeout {
                        log("*** " & testcasename() & ": FAIL:  No IVIM received BEFORE expiry of the maximum generation timer interval ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        t_maxTransInterval.stop;
                        log("*** " & testcasename() & ": INCONC: IVIM not received ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IS_IVI_GFQ_TI_02
            
        } // End of group iviGenerationFrequency
        
        group iviCommunication {
            
            function f_IS_IVI_COMM_BV_01_01() runs on ItsIvim {
                
                // Local variables
                const UInt8 c_gnNhBtpB := 2;
                var IviIdentificationNumber v_iviIdentificationNumber;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                        
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimIndWithGnParameters(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer
                            )),
                            c_gnNhBtpB
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Expected IVIM encapsultated in BTP-B packet received. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimIndWithGnParameters(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer
                            )),
                            omit
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: no GN NH information in IvimInd. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Expected IVIM received, but not encapsulated in BTP-B packet. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IS_IVI_COMM_BV_01_01
            
            function f_IS_IVI_COMM_BV_01_02() runs on ItsIvim {
                
                // Local variables
                const UInt16 c_gnNhBtpBPort := 2006;
                var IviIdentificationNumber v_iviIdentificationNumber;
                
                // Test control
                if (not PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                
                // Test adapter configuration
                
                // Preamble
                f_prInitialState();
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                
                // Test Body
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                        
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimIndWithBtpParameters(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer
                            )),
                            c_gnNhBtpBPort,
                            0
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": Expected IVIM encapsultated in BTP packet with port value 2006 received. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer
                    )))) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Expected IVIM received, but not addressed to the correct destination port. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Expected IVIM received, but not encapsulated in BTP-B packet. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IS_IVI_COMM_BV_01_02
            
            function f_IS_IVI_COMM_BV_02 () runs on ItsIvim {
                
                // Local variables
                const UInt8 c_gnHtUnc := 2;
                var IviIdentificationNumber v_iviIdentificationNumber;
                
                // Test control
                if (PICS_IVIM_GENERATION) {
                    log("*** " & testcasename() & ": PICS_IVIM_GENERATION required for executing the TC ***");
                    setverdict(inconc);
                    stop;
                }
                
                // Test component configuration
                f_cfUp();
                    
                // Preamble
                f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                    
                // Test Body
                v_iviIdentificationNumber := f_utTriggerEvent(m_utTriggerEvent());
                
                tc_ac.start;
                alt {
                    [] ivimPort.receive(
                        mw_ivimIndWithGnParameters(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer
                            )),
                            c_gnHtUnc
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": PASS: Expected IVIM encapsulated in GBC packet received. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    }
                    [] ivimPort.receive(
                        mw_ivimIndWithGnParameters(
                            mw_anyIvimPdu(
                                mw_itsPduHeader,
                                mw_ivimStructure(
                                    mw_iviManagementContainer
                            )),
                            omit
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: no GN NH information in IvimInd. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] ivimPort.receive(
                        mw_ivimInd(
                            mw_anyIvimPdu
                    )) {
                        tc_ac.stop;
                        log("*** " & testcasename() & ": FAIL: Expected IVIM received, but not encapsulated in BTP-B packet. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                    }
                    [] tc_ac.timeout {
                        log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message. ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                }
                
                // Postamble
                f_poCancelEvent(e_iut, v_iviIdentificationNumber);
                f_cfDown();
                
            } // End of function f_IS_IVI_COMM_BV_02
            
        } // End of group iviCommunication
        
    } // End of group iviMessageTransmission
    
    group iviMessageReception {
        
        /**
         * @desc    TP Function for TC_IS_IVI_MSGF_BV_02
         */
        function f_IS_IVI_MSGF_BV_02() runs on ItsIvim {
            
            // Local variables
            var IvimReq v_ivimReq;
            var integer i;
            
            // Test control
            if (not PICS_IVIM_RECEPTION) {
                log("*** " & testcasename() & ": PICS_IVIM_RECEPTION required for executing the TC ***");
                setverdict(inconc);
                stop;
            }              
            
            // Test component configuration
            f_cfUp();
            
            // Test adapter configuration
            
            // Preamble
            f_prInitialState();
            f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
            
            // Test Body
            v_ivimReq := valueof(
                m_ivimReq(
                    m_ivimStructurePdu(
                        m_ivimStructure(
                            m_iviManagementContainer(
                                f_getProvider(),
                                1,
                                IviStatus_new_
                            )
                        )
                    )
                )
            );
            ivimPort.send(v_ivimReq);
            
            f_sleep(PX_TNOAC);
            for(i:=0; i < lengthof(vc_utEvents) and not match(v_ivimReq.msgOut, vc_utEvents[i].iviMsg); i:=i+1) {
                // empty on purpose 
            }
            if(i < lengthof(vc_utEvents)) {
                log("*** " & testcasename() & ": PASS: IVIM was transmitted to upper layer ***");
                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
            }
            else {
                log("*** " & testcasename() & ": FAIL: IVIM was not transmitted to upper layer ***");
                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
            }
            
            // Postamble
            f_poDefault();
            f_cfDown();
            
        } // End of function f_IS_IVI_MSGF_BV_02
        
    } // End of group iviMessageReception
    
} // End of module ItsIvim_TpFunctions
