AtsImsIot_TP_behavior_MM.ttcn 54.1 KB
Newer Older
/*
 *  @author     TTF T010
 *  @version    $Id$
 *  @desc       This module provides the TP behaviour functions at MM interface
 */
module AtsImsIot_TP_behavior_MM {

    import from LibIms_Templates all;
    import from LibIms_UpperTester all;
    // LibIot
    import from LibIot_TypesAndValues all;
    import from LibIot_Functions all;
    import from LibIot_TestInterface all;
    import from LibIot_PIXITS all;
    // LibSip
    import from LibSip_SIPTypesAndValues all;
    import from LibSip_Templates all;
    import from LibSip_Common all;
    import from LibSip_SDPTypes all;
    // LibMsrp
    import from LibMsrp_TypesAndValues all;
    import from LibMsrp_Functions all;
    import from LibMsrp_Templates all;
    // AtsImsIot
    import from AtsImsIot_TestSystem all;
Yann Garcia's avatar
Yann Garcia committed
    import from AtsImsIot_Templates_MM all;
    import from AtsImsIot_Templates all;
    import from AtsImsIot_TypesAndValues all;
    import from AtsImsIot_Functions all;
         * @desc "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the PSAP in the IM CN subsystem of own network."
         * Reference 
         *     "ETSI TS 124 229 [1], Clauses 5.11.2"
         * Config Id CF_VxLTE_INT
         * PICS Selection NONE
         * Initial conditions with {
         *     the IMS_E_CSCF entity supportsRoutingTo the IM_CN
         * }
         * Expected behaviour
         *     ensure that {
         *         when {
         *             the IMS_E_CSCF entity receives an INVITE containing
         *                 From indicating value PX_UE_A_SIP_URI,
         *                 To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *                 CallId indicating value PX_UE_A_CALLID,
         *                 Via indicating value PX_P_CSCF_A_VIA,
         *                 Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed
         *                 PAssertedIdentity,
         *                 MessageBody;
         *             from the IMS_P_CSCF_A entity
         *         }
         *         then {
         *             the IMS_E_CSCF entity sends an INVITE containing
         *                 From indicating value PX_UE_A_SIP_URI,
         *                 To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *                 CallId indicating value PX_UE_A_CALLID,
         *                 Via indicating value PX_E_CSCF_VIA,
         *                 Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN,
         *                 RecordRoute PX_E_CSCF_SERVICE_ROUTE,
         *                 PChargingVector,
         *                 MessageBody;
         *              to the IM_CN entity
         *         }
         *     }
        */
        function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01(
                                                       in SipInterfaceMonitor p_monitorCompRef,
                                                       in boolean p_checkMessage := false,
                                                       out SipMessage p_sip
                                                       ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY);
                var ImsUserInfo v_psapInfo  := f_getSipUserId(PX_PSAP);
                
                // Check the INVITE
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
Yann Garcia's avatar
Yann Garcia committed
                                                        { mw_SipRequest(mw_TP_MM_ECSCF_INVITE_01(
                                                                                                 -, // FIXME Set expected value
                                                                                                 mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId
                                                                                                 mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId
                                                                                                 ))
                                                        },
                                                        { mw_SipRequest(mw_INVITE_Request_Base) },
                                                        {0, omit},
                                                        true,
                                                        p_checkMessage
                                                        )
                                       );
                p_monitorCompRef.done;
                // Retrieve messge
                f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
                log("##### p_sip: ", p_sip);
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_01
        /**
         * @desc "Verify that the E-CSCF successfully processes an initial INVITE from the P-CSCF and routes the request to the PSAP in the IM CN subsystem of own network and includes the LRF provided URI in the Route header."
         * Reference 
         *     "ETSI TS 124 229 [1], Clauses 5.11.2"
         * Config Id CF_VxLTE_INT
         * PICS Selection NONE
         * Initial conditions with {
         *     the IMS_E_CSCF entity supportsRoutingTo the IMS_LRF and
         *     the IMS_E_CSCF entity hasSentINVITETo the IMS_LRF and
         *     the IMS_E_CSCF entity supportsRoutingTo the IM_CN
         * }
         * Expected behaviour
         *     ensure that {
         *         when {
         *             the IMS_E_CSCF entity receives an r_3xx_Any containing
         *                 Contact indicating value LRF_provided_SIP_URI;
         *             from the IMS_LRF entity
         *         }
         *         then {
         *             the IMS_E_CSCF entity sends an INVITE containing
         *                 From indicating value PX_UE_A_SIP_URI,
         *                 To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *                 CallId indicating value PX_UE_A_CALLID,
         *                 Via indicating value PX_E_CSCF_VIA,
         *                 Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN,
         *                 RecordRoute PX_E_CSCF_SERVICE_ROUTE,
         *                 not PChargingFunctionAddresses,
         *                 PChargingVector,
         *                 MessageBody;
         *              to the IM_CN entity
         *         }
         *     }
        */
        function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_02(
                                                       in SipInterfaceMonitor p_monitorCompRef,
                                                       in boolean p_checkMessage := false,
                                                       out SipMessage p_sip
                                                       ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY);
                var ImsUserInfo v_psapInfo  := f_getSipUserId(PX_PSAP);
                
                // Check the INVITE
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
                                                        { mw_SipRequest(mw_TP_MM_ECSCF_INVITE_02(
                                                                                                 -, // FIXME Set expected value
                                                                                                 mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId
                                                                                                 mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId
                                                                                                 ))
                                                        },
                                                        { mw_SipRequest(mw_INVITE_Request_Base) },
                                                        {0, omit},
                                                        true,
                                                        p_checkMessage
                                                        )
                                       );
                p_monitorCompRef.done;
                // Retrieve messge
                f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
                log("##### p_sip: ", p_sip);
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_02

         * @desc "Verify that the E-CSCF successfully processes an callback INVITE from PSAP over the IM CN subsystem of own network and routes the request to the P-CSCF."
         * Reference 
         *     "ETSI TS 124 229 [1], Clauses 5.11.2"
         * Config Id CF_VxLTE_INT
         * PICS Selection NONE
         * Initial conditions with {
         *     the IMS_E_CSCF entity supportsRoutingTo the IM_CN
         * }
         * Expected behaviour
         *     ensure that {
         *         when {
         *             the IMS_E_CSCF entity receives an INVITE containing
         *                 From indicating value PX_UE_A_SIP_URI,
         *                 To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *                 CallId indicating value PX_UE_A_CALLID,
         *                 Via indicating value PX_P_CSCF_A_VIA,
         *                 Route indicating value PX_E_CSCF_SERVICE_ROUTE, // 5.2.10.3 1B) option is assumed
         *                 PAssertedIdentity,
         *                 MessageBody;
         *             from the IM_CN entity
         *         }
         *         then {
         *             the IMS_E_CSCF entity sends an INVITE containing
         *                 From indicating value PX_UE_A_SIP_URI,
         *                 To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *                 CallId indicating value PX_UE_A_CALLID,
         *                 Via indicating value PX_E_CSCF_VIA,
         *                 Route indicating value PX_PSAP_SERVICE_ROUTE_IM_CN,
         *                 RecordRoute PX_E_CSCF_SERVICE_ROUTE,
         *                 not PChargingFunctionAddresses,
         *                 PChargingVector,
         *                 MessageBody;
         *              to the IMS_P_CSCF_A entity
        */
        function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_03(
                                                       in SipInterfaceMonitor p_monitorCompRef,
                                                       in boolean p_checkMessage := false,
                                                       out SipMessage p_sip
                                                       ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A_EMERGENCY);
                var ImsUserInfo v_psapInfo  := f_getSipUserId(PX_PSAP);
                
                // Check the INVITE
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
                                                        { mw_SipRequest(mw_TP_MM_ECSCF_INVITE_03(
                                                                                                 -, // FIXME Set expected value
                                                                                                 mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId
                                                                                                 mw_To_AddrUnion_TelUrl(-) // v_psapInfo.publicId
                                                                                                 ))
                                                        },
                                                        { mw_SipRequest(mw_INVITE_Request_Base) },
                                                        {0, omit},
                                                        "TP_MM_ECSCF_ECO_INVITE_03 - Request",
                                                        true,
                                                        p_checkMessage
                                                        )
                                       );
                p_monitorCompRef.done;
                // Retrieve messge
                f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
                log("##### p_sip: ", p_sip);
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_INVITE_03
        
      
				/**
		 * @desc Verify that the E-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD.
		 * 
		 * Reference 
		 *     "ETSI TS 124 229 [1], Clauses 5.1.6.11.3"
		 * Config Id CF_VxLTE_INT
		 * PICS Selection NONE
		 * Initial conditions with {
		 *     the UE_A entity isEmergencyAttachedTo the EPC_A and
		 *     the UE_A entity isEmergencyRegisteredTo the IMS_A and
		 *     the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP
		 *  }
		 * Expected behaviour
		 *     ensure that {
		 *         when {
		 *             the UE_A entity isRequestedToTransferUpdatedMSD
		 *           // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01
		 *         }
		 *         then {
		 *           the IMS_P_CSCF_A entity receives an INFO containing
		 *               From indicating value PX_UE_A_SIP_URI,
		 *               To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic"
		 *               CallId indicating value PX_UE_A_CALLID,
		 *               Via indicating value PX_UE_A_VIA,
		 *               Route indicating value PX_UE_A_SERVICE_ROUTE,
		 *               InfoPackage indicating value "EmergencyCallData.eCall.MSD",
		 *               ContentDisposition indicating value "Info-Package",
		 *               MessageBody containing
		 *                  MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml
		 *                  // MSD not exceeding 140 bytes and encoded in binary ASN.1
		 *                  ContentDisposition indicating value "By-Reference";; 
		 *           from the UE_A entity
		 *       }
		 *     }
		 */
		function f_mtc_check_TP_MM_ECSCF_NGC_INVITE_01( // FIXME RMI To be reviewed
													   in SipInterfaceMonitor p_monitorCompRef,
													   in boolean p_checkMessage := false,
													   out SipMessage p_sip
													   ) runs on ImsTestCoordinator {
			 if (isvalue(p_monitorCompRef)){
				var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY);
				var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP);
                
				// Check the INVITE
				p_monitorCompRef.start(
									   f_Iot_Sip_receive(
														{ 
															mw_SipRequest(mw_TP_MM_ECSCF_NGC_INVITE_01(
																									   -, // FIXME Set expected value
																									   mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain),
																									   mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain),
																									   -, -,
																									   mw_PPreferredID,
																									   mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}),
																									   mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")})
																									   ))
														},
														{ mw_SipRequest(mw_INVITE_Request_Base) },
														{0, omit},
														"TP_MM_ECSCF_NGC_INFO_01 - Request",
														true,
														p_checkMessage
														)
									   );
				p_monitorCompRef.done;
				// Retrieve messge
				f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
			 }
		} // End of function f_mtc_check_TP_MM_ECSCF_NGC_INVITE_01
        function f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01(
Yann Garcia's avatar
Yann Garcia committed
                                                          in SipInterfaceMonitor p_monitorCompRef,
                                                          in boolean p_checkMessage := false,
                                                          in SipMessage p_sip
                                                          ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the 100 TRYING
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
Yann Garcia's avatar
Yann Garcia committed
                                                         { mw_SipResponse(mw_TP_MM_ECSCF_100Trying_01(
                                                                                                      p_sip.request.msgHeader.cSeq,
                                                                                                      p_sip.request.msgHeader.fromField,
                                                                                                      p_sip.request.msgHeader.toField
                                                                          )) 
                                                         },
                                                         { mw_SipResponse(mw_100Trying_Base) },
                                                         { 0, omit },
Yann Garcia's avatar
Yann Garcia committed
                                                         "TP_MM_ECSCF_100Trying_01",
                                                         false,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_100Trying_01
        
    } // End of group ims100Trying

    group ims180Ringing {
        
        function f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01(
Yann Garcia's avatar
Yann Garcia committed
                                                           in SipInterfaceMonitor p_monitorCompRef,
                                                           in boolean p_checkMessage := false,
                                                           in SipMessage p_sip
                                                           ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the 180 RINGING
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
Yann Garcia's avatar
Yann Garcia committed
                                                         { mw_SipResponse(mw_TP_MM_ECSCF_180Ringing_01(
                                                                                                       p_sip.request.msgHeader.cSeq,
                                                                                                       p_sip.request.msgHeader.fromField,
                                                                                                       mw_To_NameAddr_TelUrl(
                                                                                                                             -,
                                                                                                                             p_sip.request.msgHeader.toField.addressField.addrSpecUnion.components.tel.subscriber
                                                                          ))) 
                                                         },
                                                         { mw_SipResponse(mw_180Ringing_Base) },
                                                         { 0, omit },
Yann Garcia's avatar
Yann Garcia committed
                                                         "TP_MM_ECSCF_180RINGING_01",
                                                         false,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_180RINGING_01
        
    } // End of group ims180Ringing

    group ims183SessionProgress {
        
        function f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01(
Yann Garcia's avatar
Yann Garcia committed
                                                                    in SipInterfaceMonitor p_monitorCompRef,
                                                                    in boolean p_checkMessage := false,
                                                                    in SipMessage p_sip
                                                                    ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the 183 SESSION_PROGRESS
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
Yann Garcia's avatar
Yann Garcia committed
                                                         { mw_SipResponse(mw_TP_MM_ECSCF_183SessionProgress_01(
                                                                                                               p_sip.request.msgHeader.cSeq,
                                                                                                               p_sip.request.msgHeader.fromField,
                                                                                                               p_sip.request.msgHeader.toField
                                                                                                               )) 
                                                         },
                                                         { mw_SipResponse(mw_183SessionProgress_Base) },
                                                         { 0, omit },
Yann Garcia's avatar
Yann Garcia committed
                                                         "TP_MM_ECSCF_183SESSION_PROGRESS_01",
                                                         false,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_183SESSION_PROGRESS_01

    } // End of group ims183SessionProgress
    
    group ims200Ok {
        
        function f_mtc_check_TP_MM_ECSCF_ECO_200OK_01(
                                                      in SipInterfaceMonitor p_monitorCompRef,
                                                      in boolean p_checkMessage := false,
                                                      in SipMessage p_sip
                                                      ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
                
                // Check the 200 OK
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
                                                         { mw_SipResponse(mw_200OK(
                                                                                   p_sip.request.msgHeader.cSeq,
                                                                                   p_sip.request.msgHeader.callId,
                                                                                   p_sip.request.msgHeader.fromField,
                                                                                   (
                                                                                      mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}),
                                                                                      mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId),
                                                                                      p_sip.request.msgHeader.toField
                                                                                    )
                                                                                   )) 
                                                         },
                                                         { mw_SipResponse(mw_200OK_Base) },
                                                         { 0, omit },
Yann Garcia's avatar
Yann Garcia committed
                                                         "TP_MM_ECSCF_200OK_01",
                                                         false,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
                
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_200OK_01
        
    } // End of group ims200Ok
    
    group imsAck {
        
        function f_mtc_check_TP_MM_ECSCF_ECO_ACK_01(
                                                    in SipInterfaceMonitor p_monitorCompRef,
                                                    in boolean p_checkMessage := false,
                                                    in SipMessage p_sip
                                                    ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the ACK
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
Yann Garcia's avatar
Yann Garcia committed
                                                         { mw_SipRequest(mw_TP_MM_ECSCF_ACK_01(
                                                                                               p_sip.request.msgHeader.callId,
                                                                                               p_sip.request.msgHeader.cSeq,
                                                                                               -, // FIXME To be set
                                                                                               p_sip.request.msgHeader.fromField,
                                                                                               p_sip.request.msgHeader.toField
                                                                                               )) 
                                                         },
                                                         { mw_SipRequest(mw_ACK_Request_Base) },
                                                         { 0, omit },
                                                         false,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_ACK_01
        
    } // End of group imsAck
    
         * @desc Verify that the E-CSCF successfully processes a BYE from the P-CSCF for an Emergency Call and routes the request to the PSAP in the IM CN subsystem of own network
         * Initial conditions with {
         *     the IMS_E_CSCF entity supportsRoutingTo the IM_CN and
         *     the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP
         * }
         * 
         * Expected behaviour
         * ensure that {
         *     when {
         *         the IMS_E_CSCF_A entity receives a BYE containing
         *             From indicating value PX_UE_A_SIP_URI,
         *             To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *             CallId indicating value PX_UE_A_CALLID,
         *             Via indicating value PX_UE_A_VIA,
         *             Route indicating value PX_UE_A_SERVICE_ROUTE
         *             ;
         *         from the IMS_P_CSCF_A entity
         *     }
         *     then {
         *         the IMS_E_CSCF_A entity sends a BYE containing
         *             From indicating value PX_UE_A_SIP_URI,
         *             To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *             CallId indicating value PX_UE_A_CALLID,
         *             Via indicating value PX_UE_A_VIA,
         *             Route indicating value PX_UE_A_SERVICE_ROUTE;
         *         to the IM_CN entity
        function f_mtc_check_TP_MM_ECSCF_ECO_BYE_01(
                                                    in SipInterfaceMonitor p_monitorCompRef,
                                                    in boolean p_checkMessage := false,
                                                    inout SipMessage p_sip
                                                    ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the BYE
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
Yann Garcia's avatar
Yann Garcia committed
                                                         { mw_SipRequest(mw_TP_MM_ECSCF_BYE_01(
                                                                                               p_sip.request.msgHeader.callId,
                                                                                               -, // New CSeq,
                                                                                               -, // FIXME To be set
                                                                                               p_sip.request.msgHeader.fromField,
                                                                                               p_sip.request.msgHeader.toField
                                                                                               )) 
                                                         },
                                                         { mw_SipRequest(mw_BYE_Request_Base) },
                                                         { 0, omit },
                                                         true,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
                // Retrieve messge
                f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_BYE_01
        /**
         * @desc Verify that the E-CSCF successfully processes a BYE from the PSAP in the IM CN subsystem for an Emergency Call and routes the request to the P-CSCF of home network
         * Initial conditions with {
         *     the IMS_E_CSCF entity supportsRoutingTo the IM_CN and
         *     the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP
         * }
         * 
         * Expected behaviour
         * ensure that {
         *     when {
         *         the IMS_E_CSCF_A entity receives a BYE containing
         *             From indicating value PX_PSAP_SIP_URI,
         *             To indicating value PX_UE_A_SIP_URI,
         *             CallId indicating value PX_PSAP_SIP_URI,
         *             Via indicating value PX_PSAP_VIA;
         *         from the IM_CN entity
         *     }
         *     then {
         *         the IMS_E_CSCF_A entity sends a BYE containing
         *             From indicating value PX_PSAP_SIP_URI,
         *             To indicating value PX_UE_A_SIP_URI,
         *             CallId indicating value PX_PSAP_SIP_URI,
         *             Via indicating value PX_PSAP_VIA;
         *         to the IMS_P_CSCF_A entity
         *         }
         *     }
         */
        function f_mtc_check_TP_MM_ECSCF_ECO_BYE_02(
                                                    in SipInterfaceMonitor p_monitorCompRef,
                                                    in boolean p_checkMessage := false,
                                                    inout SipMessage p_sip
                                                    ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the BYE
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
                                                                                               p_sip.request.msgHeader.callId,
                                                                                               -, // New CSeq,
                                                                                               -, // FIXME To be set
                                                                                               {
                                                                                                 fieldName := FROM_E,
                                                                                                 addressField := p_sip.request.msgHeader.toField.addressField,
                                                                                                 fromParams := *
                                                                                               }, //p_sip.request.msgHeader.fromField,
                                                                                               {
                                                                                                 fieldName := TO_E,
                                                                                                 addressField := p_sip.request.msgHeader.fromField.addressField,
                                                                                                 toParams := *
                                                                                               } //p_sip.request.msgHeader.toField
                                                                                               )) 
                                                         },
                                                         { mw_SipRequest(mw_BYE_Request_Base) },
                                                         { 0, omit },
                                                         "TP_MM_ECSCF_ECO_BYE_02 - Request",
                                                         true,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
                // Retrieve messge
                f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_BYE_02

    } // End of group imsBye
    
    group ims200OkBye {
        
        function f_mtc_check_TP_MM_ECSCF_ECO_200OK_BYE_01(
                                                          in SipInterfaceMonitor p_monitorCompRef,
                                                          in boolean p_checkMessage := false,
                                                          in SipMessage p_sip
                                                          ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the 200 OK BYE
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
                                                         { mw_SipResponse(mw_ECO_200OK(
                                                                                       p_sip.request.msgHeader.cSeq,
                                                                                       p_sip.request.msgHeader.callId,
                                                                                       p_sip.request.msgHeader.fromField,
                                                                                       p_sip.request.msgHeader.toField
                                                                                       )) 
                                                         },
                                                         { mw_SipResponse(mw_200OK_Base) },
                                                         { 0, omit },
Yann Garcia's avatar
Yann Garcia committed
                                                         "TP_MM_ECSCF_200OK_BYE_01",
                                                         false,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_200OK_BYE_01

    } // End of group ims200OkBye

    group imsCancel {
        
        /**
         * @desc Verify that the E-CSCF successfully processes a CANCEL from the P-CSCF for an Emergency Call under establishment and routes the request to the PSAP in the IM CN subsystem of own network
         * Initial conditions with {
         *     the IMS_E_CSCF entity supportsRoutingTo the IM_CN and
         *     the UE_A entity hasAchievedInitialEmergencyINVITE
         * }
         * 
         * Expected behaviour
         * ensure that {
         *     when {
         *         the IMS_E_CSCF_A entity receives a CANCEL containing
         *             From indicating value PX_UE_A_SIP_URI,
         *             To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *             CallId indicating value PX_UE_A_CALLID,
         *             Via indicating value PX_UE_A_VIA,
         *             Route indicating value PX_UE_A_SERVICE_ROUTE;
         *         from the IMS_P_CSCF_A entity
         *     }
         *     then {
         *         the IMS_E_CSCF_A entity sends a CANCEL containing
         *             From indicating value PX_UE_A_SIP_URI,
         *             To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *             CallId indicating value PX_UE_A_CALLID,
         *             Via indicating value PX_UE_A_VIA,
         *             Route indicating value PX_UE_A_SERVICE_ROUTE;
         *         to the IM_CN entity
         *         }
         *     }
         */
        function f_mtc_check_TP_MM_ECSCF_EMC_CANCEL_01(
                                                       in SipInterfaceMonitor p_monitorCompRef,
                                                       in boolean p_checkMessage := false,
                                                       inout SipMessage p_sip
                                                       ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the CANCEL
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
Yann Garcia's avatar
Yann Garcia committed
                                                         { mw_SipRequest(mw_TP_MM_ECSCF_CANCEL_01(
                                                                                                  p_sip.request.msgHeader.callId,
                                                                                                  -, // New CSeq,
                                                                                                  -, // FIXME To be set
                                                                                                  p_sip.request.msgHeader.fromField,
                                                                                                  p_sip.request.msgHeader.toField
                                                                                                  )) 
                                                         },
                                                         { mw_SipRequest(mw_CANCEL_Request_Base) },
                                                         { 0, omit },
                                                         true,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
                // Retrieve messge
                f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_EMC_CANCEL_01

    } // End of group imsCancel
Yann Garcia's avatar
Yann Garcia committed

    group imsRequestTermination {

        /**
         * @desc Verify that the E-CSCF successfully processes a 487 response from the PSAP in the IM CN subsystem for an Emergency Call and routes the response to the P-CSCF of home network
         * Initial conditions with {
         *     the IMS_E_CSCF entity supportsRoutingTo the IM_CN and
         *     the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP
         * }
         * 
         * Expected behaviour
         * ensure that {
         *     when {
         *         the IMS_E_CSCF_A entity receives a 487INVITE containing
         *             From indicating value PX_UE_A_SIP_URI,
         *             To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *             CallId indicating value PX_UE_A_CALLID,
         *             Via indicating value PX_UE_A_VIA,
         *             Route indicating value PX_UE_A_SERVICE_ROUTE;
         *         from the IM_CN entity
         *     }
         *     then {
         *         the IMS_E_CSCF_A entity sends a 480INVITE containing
         *             From indicating value PX_UE_A_SIP_URI,
         *             To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *             CallId indicating value PX_UE_A_CALLID,
         *             Via indicating value PX_UE_A_VIA,
         *             Route indicating value PX_UE_A_SERVICE_ROUTE;
         *         to the IMS_P_CSCF_A entity
         *         }
         *     }
         */
        function f_mtc_check_TP_MM_ECSCF_EMC_487INVITE_01(
Yann Garcia's avatar
Yann Garcia committed
                                                          in SipInterfaceMonitor p_monitorCompRef,
                                                          in boolean p_checkMessage := false,
                                                          inout SipMessage p_sip
                                                          ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the 487 Request Terminated
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
                                                         { 
                                                            mw_SipResponse(
                                                                           mw_487RequestTerminated( // TODO Enforce template
                                                                                                   p_sip.request.msgHeader.callId,
                                                                                                   -, // New CSeq
                                                                                                   p_sip.request.msgHeader.fromField,
                                                                                                   p_sip.request.msgHeader.toField,
                                                                                                   omit
                                                                                                   )
                                                                          )
                                                         },
                                                         { 
                                                             mw_SipResponse(mdw_4XX_Base)
                                                         },
                                                         { 0, omit },
Yann Garcia's avatar
Yann Garcia committed
                                                         true,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
                // Retrieve messge
                f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_EMC_487INVITE_01
Yann Garcia's avatar
Yann Garcia committed
        
    } // End of group imsRequestTermination

    group imsTemporaryUnavailable {

        /**
         * @desc Verify that the E-CSCF successfully processes a 480 response from the PSAP in the IM CN subsystem for an Emergency Call and routes the response to the P-CSCF of home network
         * Initial conditions with {
         *     the IMS_E_CSCF entity supportsRoutingTo the IM_CN and
         *     the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP
         * }
         * 
         * Expected behaviour
         * ensure that {
         *     when {
         *         the IMS_E_CSCF_A entity receives a 480INVITE containing
         *             From indicating value PX_UE_A_SIP_URI,
         *             To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *             CallId indicating value PX_UE_A_CALLID,
         *             Via indicating value PX_UE_A_VIA,
         *             Route indicating value PX_UE_A_SERVICE_ROUTE;
         *         from the IM_CN entity
         *     }
         *     then {
         *         the IMS_E_CSCF_A entity sends a 480INVITE containing
         *             From indicating value PX_UE_A_SIP_URI,
         *             To indicating value PX_SIP_EMERGENCY_SERVICE_URN,
         *             CallId indicating value PX_UE_A_CALLID,
         *             Via indicating value PX_UE_A_VIA,
         *             Route indicating value PX_UE_A_SERVICE_ROUTE;
         *         to the IMS_P_CSCF_A entity
         *         }
         *     }
         */
        function f_mtc_check_TP_MM_ECSCF_ECO_480INVITE_01(
Yann Garcia's avatar
Yann Garcia committed
                                                          in SipInterfaceMonitor p_monitorCompRef,
                                                          in boolean p_checkMessage := false,
                                                          inout SipMessage p_sip
                                                          ) runs on ImsTestCoordinator {
            if (isvalue(p_monitorCompRef)) {
                // Check the 487 Request Terminated
                p_monitorCompRef.start(
                                       f_Iot_Sip_receive(
                                                         { 
                                                            mw_SipResponse(mw_480TemporaryUnavailable(-, p_sip.request.msgHeader.cSeq))
Yann Garcia's avatar
Yann Garcia committed
                                                         },
                                                         { 
                                                             mw_SipResponse(mdw_4XX_Base)
                                                         },
                                                         { 0, omit },
Yann Garcia's avatar
Yann Garcia committed
                                                         true,
                                                         p_checkMessage
                                                         )
                                        );
                p_monitorCompRef.done;
                // Retrieve messge
                f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
            }
        } // End of function f_mtc_check_TP_MM_ECSCF_ECO_480INVITE_01
Yann Garcia's avatar
Yann Garcia committed
        
    } // End of group imsTemporaryUnavailable


    group imsINFO{  
		
		/**
		 * @desc Verify that the E-CSCF sends an INFO request demanding a transfer of updated MSD.
		 * 
		 * Reference 
		 *     "ETSI TS 124 229 [1], Clauses 5.1.6.11.3"
		 * Config Id CF_VoLTE_INT_ES
		 * PICS Selection NONE
		 * Initial conditions with {
		 *     the UE_A entity isEmergencyAttachedTo the EPC_A and
		 *     the UE_A entity isEmergencyRegisteredTo the IMS_A and
		 *     the UE_A entity isEmergencyRegisteredTo the IMS_A and
		 *     the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP
		 *  }
		 * Expected behaviour
		 *     ensure that { 
                when { 
                    the IMS_P_CSCF_A entity receives a INFO containing "Request transfer of updated MSD";
                    from the IMS_E_CSCF entity
                }
                then {
                    the IMS_P_CSCF_A entity sends a INFO containing
                        From indicating value PX_PSAP_SIP_URI,
                        To indicating value PX_UE_A_SIP_URI,
                        CallId indicating value PX_PSAP_CALLID,
                        Via indicating value PX_PSAP_VIA,
                        Route indicating value PX_PSAP_SERVICE_ROUTE,
                        InfoPackage indicating value "EmergencyCallData.eCall.MSD",
                        ContentDisposition indicating value "Info-Package",
                        MessageBody containing
                           MIME indicating value "application/EmergencyCallData.Control+xml", // MIME may contain additional parts e.g., sdp, xml
                           request containing
                              action indicating value "send-data",
                              datatype indicating value "eCall.MSD";,
                           ContentDisposition indicating value "By-Reference";; 
                    to the UE_A entity
                }
            }

		 */
		function f_mtc_check_TP_MM_ECSCF_NGC_INFO_01(
													   in SipInterfaceMonitor p_monitorCompRef,
													   in boolean p_checkMessage := false,
													   out SipMessage p_sip
													   ) runs on ImsTestCoordinator {
			 if (isvalue(p_monitorCompRef)){
				var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY);
				var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP);
                
				// Check the INVITE
				p_monitorCompRef.start(
									   f_Iot_Sip_receive(
														{ 
															mw_SipRequest(mw_TP_MM_ECSCF_NGC_INFO_01(
																									   -, // FIXME Set expected value
																									   mw_From_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain),
																									   mw_To_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain),
																									   -, -,
																									   mw_PPreferredID,
																									   mw_accept({mw_acceptBody("application/EmergencyCallData.Control+xml")}),
																									   mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")})
																									   ))
														},
														{ mw_SipRequest(mw_INFO_Request_Base) },
														{0, omit},
														"TP_MM_ECSCF_NGC_INFO_01 - Request",
														true,
														p_checkMessage
														)
									   );
				p_monitorCompRef.done;
				// Retrieve messge
				f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
			 }
		} // End of function f_mtc_check_TP_MM_ECSCF_NGC_INFO_01
		
		/**
		 * @desc Verify that the E-CSCF successfully receives an INFO from the UE in an established eCall type emergency call that has been requested to transfer an updated MSD.
		 * 
		 * Reference 
		 *     "ETSI TS 124 229 [1], Clauses 5.1.6.11.3"
		 * Config Id CF_VxLTE_INT
		 * PICS Selection NONE
		 * Initial conditions with {
		 *     the UE_A entity isEmergencyAttachedTo the EPC_A and
		 *     the UE_A entity isEmergencyRegisteredTo the IMS_A and
		 *     the UE_A entity previouslyEstablishedEmergencyCallWith the PSAP
		 *  }
		 * Expected behaviour
		 *     ensure that {
		 *         when {
		 *             the UE_A entity isRequestedToTransferUpdatedMSD
		 *           // UE_A has received an INFO request as described in TP_MW_PCSCF_NGC_INFO_01
		 *         }
		 *         then {
		 *           the IMS_P_CSCF_A entity receives an INFO containing
		 *               From indicating value PX_UE_A_SIP_URI,
		 *               To indicating value PX_SIP_ECALL_EMERGENCY_SERVICE_URN, // "urn:service:sos.ecall.manual" or "urn:service:sos.ecall.automatic"
		 *               CallId indicating value PX_UE_A_CALLID,
		 *               Via indicating value PX_UE_A_VIA,
		 *               Route indicating value PX_UE_A_SERVICE_ROUTE,
		 *               InfoPackage indicating value "EmergencyCallData.eCall.MSD",
		 *               ContentDisposition indicating value "Info-Package",
		 *               MessageBody containing
		 *                  MIME indicating value "application/EmergencyCallData.eCall.MSD", // MIME may contain additional parts e.g., sdp, xml
		 *                  // MSD not exceeding 140 bytes and encoded in binary ASN.1
		 *                  ContentDisposition indicating value "By-Reference";; 
		 *           from the UE_A entity
		 *       }
		 *     }
		 */
		function f_mtc_check_TP_MM_ECSCF_NGC_INFO_02(
													   in SipInterfaceMonitor p_monitorCompRef,
													   in boolean p_checkMessage := false,
													   out SipMessage p_sip
													   ) runs on ImsTestCoordinator {
			 if (isvalue(p_monitorCompRef)){
				var ImsUserInfo v_userInfoA := f_getSipUserId(PX_EUT_A_EMERGENCY);
				var ImsUserInfo v_psap := f_getSipUserId(PX_PSAP);
                
				// Check the INVITE
				p_monitorCompRef.start(
									   f_Iot_Sip_receive(
														{ 
															mw_SipRequest(mw_TP_MM_ECSCF_NGC_INFO_01(
																									   -, // FIXME Set expected value
																									   mw_From_AddrUnion_SipUrl(omit, v_userInfoA.publicId, v_userInfoA.domain),
																									   mw_To_AddrUnion_SipUrl(omit, v_psap.publicId, v_psap.domain),
																									   -,
																									   -,
																									   mw_PPreferredID,
																									   mw_accept({mw_acceptBody("application/EmergencyCallData.MSD")}),
																									   mw_recvInfo({mw_infoPackage_Type("EmergencyCallData.eCall.MSD")})
																									   ))
														},
														{ mw_SipRequest(mw_INFO_Request_Base) },
														{0, omit},
														"TP_MM_ECSCF_NGC_INFO_02 - Request",
														true,
														p_checkMessage
														)
									   );
				p_monitorCompRef.done;
				// Retrieve messge
				f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
			 }
		} // End of function f_mtc_check_TP_MM_ECSCF_NGC_INFO_02
		
	}// End of group imsINFO


} // End of module AtsImsIot_TP_behavior_MM