/** * @author ETSI / STF484 / STF517 * @version $Url: https://oldforge.etsi.org/svn/LibIts/tags/20170222_STF527_Final/ttcn/MapemSpatem/LibItsMapemSpatem_Functions.ttcn $ * $Id: LibItsMapemSpatem_Functions.ttcn,v 1.2 2018/05/31 15:57:09 dte Exp $ * @desc Module containing common functions for ITS MAPEM SPATEM * @copyright ETSI Copyright Notification * No part may be reproduced except as authorized by written permission. * The copyright and the foregoing restriction extend to reproduction in all media. * All rights reserved. * */ module LibItsMapemSpatem_Functions { // LibCommon import from LibCommon_Sync all; import from LibCommon_Time all; import from LibCommon_VerdictControl all; // LibIts import from ITS_Container language "ASN.1:1997" all; import from DSRC language "ASN.1:1997" all; import from IEEE1609dot2BaseTypes language "ASN.1:1997" all; // LibItsCommon import from LibItsCommon_TypesAndValues all; import from LibItsCommon_Templates all; import from LibItsCommon_Functions all; import from LibItsCommon_Pixits all; // LibItsSecurity import from LibItsSecurity_Functions all; // LibItsMapemSpatem import from LibItsMapemSpatem_TestSystem all; import from LibItsMapemSpatem_TypesAndValues all; import from LibItsMapemSpatem_Templates all; import from LibItsMapemSpatem_Pics all; import from LibItsMapemSpatem_Pixits all; group utFuntions { /** * @desc Requests to bring the IUT in an initial state * @param p_init The initialisation to trigger. */ function f_utInitializeIut(template (value) UtMapemSpatemInitialize p_init) runs on ItsMapemSpatem { //deactivate mapemSpatemPort default alts vc_mapemSpatemDefaultActive := false; utPort.send(p_init); tc_wait.start; alt { [] utPort.receive(UtMapemSpatemResults: { utMapemSpatemInitializeResult := true }) { tc_wait.stop; log("*** " & testcasename() & ": INFO: IUT initialized ***"); } [] tc_wait.timeout { log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***"); f_selfOrClientSyncAndVerdict("error", e_timeout); } } //deactivate mapemSpatemPort default alts vc_mapemSpatemDefaultActive := true; } /** * @desc Triggers an event from the application layer * @param p_event The event to trigger. */ function f_utTriggerEvent( in template (value) UtMapemSpatemTrigger p_event ) runs on ItsMapemSpatem { //deactivate mapemSpatemPort default alts vc_mapemSpatemDefaultActive := false; utPort.send ( p_event ); tc_wait.start; alt { [] utPort.receive ( UtMapemSpatemResults: { utMapemSpatemTriggerResult := true }) { tc_wait.stop; } [] utPort.receive ( UtMapemSpatemResults: { utMapemSpatemTriggerResult := false }) { tc_wait.stop; f_selfOrClientSyncAndVerdict("MapSpat Trigger failed", e_error); } [] tc_wait.timeout { log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***"); f_selfOrClientSyncAndVerdict("error", e_timeout); } } //deactivate mapemSpatemPort default alts vc_mapemSpatemDefaultActive := true; return; } } // End of group utFuntions group adapterControl { /** * @desc Initialise secure mode if required */ function f_initialiseSecuredMode( in charstring p_certificateId := PX_CERT_FOR_TS ) runs on ItsMapemSpatem { if (PICS_IS_IUT_SECURED == true) { if(e_success != f_acTriggerSecEvent(m_acEnableSecurity(p_certificateId))) { log("*** INFO: TEST CASE NOW STOPPING ITSELF! ***"); stop; } } } // End of function f_initialiseSecuredMode() function f_uninitialiseSecuredMode() runs on ItsMapemSpatem { if (PICS_IS_IUT_SECURED == true) { f_acTriggerSecEvent(m_acDisableSecurity); } } // End of function f_initialiseSecuredMode() /** * @desc Triggers event in the test system adaptation. * @param p_event The event to trigger * @return FncRetCode */ function f_acTriggerSecEvent(template (value) AcSecPrimitive p_event) runs on ItsMapemSpatem return FncRetCode { var FncRetCode v_ret := e_success; acPort.send(p_event); tc_ac.start; alt { [] acPort.receive(m_acSecResponseSuccess) { tc_ac.stop; } [] acPort.receive { tc_ac.stop; log("*** " & __SCOPE__ & ": ERROR: Received unexpected message ***"); f_selfOrClientSyncAndVerdict("error", e_error); } [] tc_ac.timeout { log("*** " & __SCOPE__ & ": ERROR: Timeout while waiting for adapter control event result ***"); f_selfOrClientSyncAndVerdict("error", e_timeout); } } return v_ret; } } // End of group adapterControl group altsteps { /** * @desc Default handling cf01 de-initialisation. */ altstep a_cf01Down() runs on ItsMapemSpatem { [] a_shutdown() { f_poDefault(); f_cfDown(); log("*** a_cf01Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***"); stop; } } /** * @desc Default handling cf02 de-initialisation. */ altstep a_cf02Down() runs on ItsMtc { [] a_shutdown() { f_cf02Down(); log("*** a_cf02Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***"); stop; } } /** * @desc The base default. */ altstep a_default() runs on ItsMapemSpatem { [vc_mapemSpatemDefaultActive] mapemSpatemPort.receive(mw_mapemInd(mw_mapemPdu(mw_defaultMapem))) { log("*** " & testcasename() & ": INFO: MAPEM received in default ***"); vc_mapemReceived := true; repeat; } [vc_mapemSpatemDefaultActive] mapemSpatemPort.receive(mw_spatemInd(mw_spatemPdu(mw_defaultSpatem))) { log("*** " & testcasename() & ": INFO: MAPEM received in default ***"); vc_spatemReceived := true; repeat; } [vc_mapemSpatemDefaultActive] mapemSpatemPort.receive { log("*** " & testcasename() & ": ERROR: Received an unexpected message ***"); f_selfOrClientSyncAndVerdict("error", e_error); } [] any timer.timeout { log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message ***"); f_selfOrClientSyncAndVerdict("error", e_timeout); } [] a_shutdown() { f_poDefault(); f_cfDown(); log("*** " & testcasename() & ": INFO: TEST COMPONENT NOW STOPPING ITSELF! ***"); stop; } } /** * @desc The default for handling upper tester messages. */ altstep a_utDefault() runs on ItsMapemSpatem { var UtMapemEventInd v_mapemevent; var UtSpatemEventInd v_spatemevent; [] utPort.receive(UtMapemEventInd:?) -> value v_mapemevent { //store every upper tester indication received log("*** " & testcasename() & ": INFO: Store UtMapemEventInd messge ***"); vc_utMapemEvents[lengthof(vc_utMapemEvents)] := v_mapemevent; repeat; } [] utPort.receive(UtSpatemEventInd:?) -> value v_spatemevent { //store every upper tester indication received log("*** " & testcasename() & ": INFO: Store UtSpatemEventInd messge ***"); vc_utSpatemEvents[lengthof(vc_utSpatemEvents)] := v_spatemevent; repeat; } [] utPort.receive { log("*** " & testcasename() & ": INFO: Received unhandled/unknown UT message from IUT ***"); repeat; } } } // End of group altsteps group mapSpatConfigurationFunctions { /** * @desc Setups default configuration * @param p_certificateId The certificate identifier the TA shall use in case of secured IUT */ function f_cfUp( in charstring p_certificateId := PX_CERT_FOR_TS ) runs on ItsMapemSpatem system ItsMapemSpatemSystem { map(self:acPort, system:acPort); map(self:utPort, system:utPort); map(self:mapemSpatemPort, system:mapemSpatemPort); // Connect f_connect4SelfOrClientSync(); activate(a_cf01Down()); // Initialise secured mode f_initialiseSecuredMode(p_certificateId); } // End of f_cfUp /** * @desc Deletes default configuration */ function f_cfDown() runs on ItsMapemSpatem /* TITAN TODO: system ItsMapemSpatemSystem */ { // Initialise secured mode f_uninitialiseSecuredMode(); unmap(self:utPort, system:utPort); unmap(self:acPort, system:acPort); unmap(self:mapemSpatemPort, system:mapemSpatemPort); f_disconnect4SelfOrClientSync(); } // End of f_cfDown /** * @desc Setups default configuration * @param p_certificateId The certificate identifier the TA shall use in case of secured IUT */ function f_cf02Up(in charstring p_certificateId := PX_CERT_FOR_TS ) runs on ItsMtc mtc ItsMtc system ItsMapemSpatemSystem { // Variables var integer i; // Select components vc_componentTable := {{c_compMap, omit}, {c_compSpat, omit}}; // Create components for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { vc_componentTable[i].msComponent := ItsMapemSpatem.create(vc_componentTable[i].componentName) alive; } // Map & Connect map(self:acPort, system:acPort); map(self:utPort, system:utPort); connect(self:syncPort, mtc:syncPort); for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { map(vc_componentTable[i].msComponent:acPort, system:acPort); map(vc_componentTable[i].msComponent:utPort, system:utPort); map(vc_componentTable[i].msComponent:mapemSpatemPort, system:mapemSpatemPort); connect(vc_componentTable[i].msComponent:syncPort, self:syncPort); } activate(a_cf02Down()); // Initialise secured mode f_initialiseSecuredMode(p_certificateId); } // End of f_cf02Up /** * @desc Deletes default configuration */ function f_cf02Down() runs on ItsMtc mtc ItsMtc system ItsMapemSpatemSystem { // Local variables var integer i; f_uninitialiseSecuredMode(); // Unmap & Disconnect for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { unmap(vc_componentTable[i].msComponent:utPort, system:utPort); unmap(vc_componentTable[i].msComponent:acPort, system:acPort); unmap(vc_componentTable[i].msComponent:mapemSpatemPort, system:mapemSpatemPort); disconnect(vc_componentTable[i].msComponent:syncPort, self:syncPort); } unmap(self:acPort, system:acPort); unmap(self:utPort, system:utPort); disconnect(self:syncPort, mtc:syncPort); } // End of f_cf02Down } // End of of mapSpatConfigurationFunctions group preambles { /** * @desc The default preamble. */ function f_prDefault() runs on ItsMapemSpatem { vc_default := activate(a_default()); activate(a_utDefault()); } /** * @desc Brings the IUT into an initial state. * @return FncRetCode */ function f_prInitialState( in charstring p_certificate_id := "" ) runs on ItsMapemSpatem return FncRetCode { var FncRetCode v_ret := e_success; // Initialize IUT with given certificate if (p_certificate_id != "") { // Initialize IUT with given certificate var HashedId8 v_hashedId8 := '0000000000000000'O; fx_readCertificateDigest("CERT_SRM_SSP_NONE", v_hashedId8); if ('0000000000000000'O == v_hashedId8) { // Certificate not found log("*** " & testcasename() & ": Required IUT certificate is not found on the test system ***"); return e_timeout; } f_utInitializeIut(m_mapemSpatemInitialize(v_hashedId8)); } else { f_utInitializeIut(m_mapemSpatemInitialize); } f_prDefault(); return v_ret; } } // End of group preambles group postambles { /** * @desc The default postamble. */ function f_poDefault() runs on ItsMapemSpatem { //empty } } // End of group postambles group receiveFunctions { /** * @desc Awaits a SPATE message and returns it * @param p_rcvMsg The expected message to be received. * @param p_rcvdMsg The received message - OUT. */ function f_awaitSpateMessage(in template (present) SpatemInd p_rcvMsg, out SpatemInd p_rcvdMsg) runs on ItsMapemSpatem { tc_ac.start; alt { [] mapemSpatemPort.receive(p_rcvMsg) -> value p_rcvdMsg { tc_ac.stop; } [] tc_ac.timeout { log("*** " & testcasename() & ": INFO: Timeout while awaiting the reception of a message ***"); f_selfOrClientSyncAndVerdict("error", e_timeout); } } } /** * @desc Awaits a MAPE message and returns it * @param p_rcvMsg The expected message to be received. * @param p_rcvdMsg The received message - OUT. */ function f_awaitMapeMessage(in template (present) MapemInd p_rcvMsg, out MapemInd p_rcvdMsg) runs on ItsMapemSpatem { tc_ac.start; alt { [] mapemSpatemPort.receive(p_rcvMsg) -> value p_rcvdMsg { tc_ac.stop; } [] tc_ac.timeout { log("*** " & testcasename() & ": INFO: Timeout while awaiting the reception of a message ***"); f_selfOrClientSyncAndVerdict("error", e_timeout); } } } } // End of group receiveFunctions group componentFunctions { /** * @desc Get the component corresponding to a key * @param p_componentName Name searched component * @return ItsGeoNetworking - The searched position vector */ function f_getComponent( in charstring p_componentName ) runs on ItsMtc return ItsMapemSpatem { var ItsMapemSpatem v_return := null; var integer i := 0; for (i:=0; i