Newer
Older
* @author ETSI / STF449 / STF484 / STF517
* @version $URL$
* @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.
// LibCommon
import from LibCommon_Sync all;
import from LibCommon_VerdictControl all;
import from LibCommon_Time { modulepar PX_TNOAC ; function f_sleep };
// LibIts
import from ITS_Container language "ASN.1:1997" all;
import from DENM_PDU_Descriptions language "ASN.1:1997" all;
import from LibItsCommon_Templates all;
import from LibItsCommon_TypesAndValues all;
import from LibItsCommon_Functions all;
import from LibItsCommon_Pixits all;
import from LibItsDenm_TypesAndValues all;
import from LibItsDenm_Templates all;
import from LibItsDenm_Pixits all;
import from LibItsDenm_Pics 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) UtInitialize p_init) runs on ItsDenm {
//deactivate denmPort default alts
vc_denmDefaultActive := false;
log("*** " & testcasename() & ": INFO: IUT initialized ***");
[] a_utDefault() {
//empty on purpose
}
log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
}
//activate denmPort default alts
vc_denmDefaultActive := true;
/**
* @desc Requests to change the IUT with a new pseudonym
* @param p_change The change to trigger.
*/
function f_utChangePseudonym ( template (value) UtChangePseudonym p_change ) runs on ItsDenm {
//deactivate denmPort default alts
vc_denmDefaultActive := false;
utPort.send(p_change);
tc_wait.start;
alt {
[] utPort.receive(UtChangePseudonymResult:true) {
tc_wait.stop;
log("*** " & testcasename() & ": INFO: IUT pseudonym changed ***");
}
[] utPort.receive(UtChangePseudonymResult:false) {
tc_wait.stop;
log("*** " & testcasename() & ": INFO: IUT pseudonym changed ***");
f_selfOrClientSyncAndVerdict("error", e_error);
}
[] a_utDefault() {
//empty on purpose
}
log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
}
}
//activate denmPort default alts
vc_denmDefaultActive := true;
* @desc Triggers an event from the application layer
function f_utTriggerEvent(template (value) UtDenmTrigger p_event) runs on ItsDenm return ActionID {
//deactivate denmPort default alts
vc_denmDefaultActive := false;
[] utPort.receive(UtDenmTriggerResult:?) -> value v_result {
f_selfOrClientSyncAndVerdict("DENM Trigger failed", e_error);
}
[] a_utDefault() {
//empty on purpose
}
[] tc_wait.timeout {
log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
//activate denmPort default alts
vc_denmDefaultActive := true;
* @desc Updates an event at the application layer
* @param p_event The event to update.
function f_utUpdateEvent(template (value) UtDenmUpdate p_event) runs on ItsDenm return ActionID {
var UtDenmUpdateResult v_result;
//deactivate denmPort default alts
vc_denmDefaultActive := false;
[] utPort.receive(UtDenmUpdateResult:?) -> value v_result {
[] a_utDefault() {
//empty on purpose
}
log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
}
//activate denmPort default alts
vc_denmDefaultActive := true;
return v_actionId;
}
/**
* @desc Terminates an event at the application layer
* @param p_event The event to terminate.
*/
function f_utTerminateEvent(template (value) UtDenmTermination p_event) runs on ItsDenm {
//deactivate denmPort default alts
vc_denmDefaultActive := false;
[] utPort.receive(UtDenmTerminationResult:?) {
log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
}
[] a_utDefault() {
//empty on purpose
}
//activate denmPort default alts
vc_denmDefaultActive := true;
/**
* @desc Changes the position of the IUT
* @param p_latitude
* @param p_longitude
* @param p_elevation
*/
function f_utChangePosition(template (value) UtChangePosition p_position) runs on ItsDenm {
//deactivate denmPort default alts
vc_denmDefaultActive := false;
alt {
[] utPort.receive(UtChangePositionResult:?) {
tc_wait.stop;
}
log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
}
[] a_utDefault() {
//empty on purpose
}
//activate denmPort default alts
vc_denmDefaultActive := true;
/**
* @desc Initialise secure mode if required
*/
function f_initialiseSecuredMode(
in charstring p_certificateId := PX_CERT_FOR_TS
) runs on ItsDenm {
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 ItsDenm {
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(
in template (value) AcSecPrimitive p_event
) runs on ItsDenm 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;
}
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
/**
* @desc Triggers event in the test system adaptation.
* @param p_event The event to trigger
* @return FncRetCode
*/
function f_acTriggerGnssEvent(template (value) AcGnssPrimitive p_event) runs on ItsDenm return FncRetCode {
var FncRetCode v_ret := e_success;
acPort.send(p_event);
tc_ac.start;
alt {
[] acPort.receive(m_acGnssResponseSuccess) {
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;
}
/**
* @desc Loads the given scenario
*
* @param p_scenario The scenario to load.
*/
function f_acLoadScenario(Scenario p_scenario) runs on ItsDenm {
f_acTriggerGnssEvent(m_loadScenario(p_scenario));
}
} // End of function f_acLoadScenario
/**
* @desc Starts a loaded scenario
*/
function f_acStartScenario() runs on ItsDenm {
f_acTriggerGnssEvent(m_startScenario);
vc_scenarioStarted := true;
}
} // End of function f_acStartScenario
/**
* @desc Stops a loaded scenario
*/
function f_acStopScenario() runs on ItsDenm {
if (PX_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
f_acTriggerGnssEvent(m_stopScenario);
vc_scenarioStarted := false;
}
} // End of function f_acStopScenario
function f_acAwaitDistanceCovered(float p_distanceToCover) runs on ItsDenm return FncRetCode {
var FncRetCode v_ret := e_success;
if (PX_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
f_acTriggerGnssEvent(m_distanceToCover(p_distanceToCover));
tc_ac.start;
alt {
[] acPort.receive(m_acGnssDistanceCovered) {
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 covered distance indication ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
}
}
}
return v_ret;
} // End of function f_acAwaitDistanceCovered
} // End of group adapterControl
/**
* @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 ItsDenm system ItsDenmSystem {
map(self:acPort, system:acPort);
map(self:utPort, system:utPort);
map(self:denmPort, system:denmPort);
f_connect4SelfOrClientSync();
// Initialise secured mode
f_initialiseSecuredMode(p_certificateId);
} // End of function f_cfUp
/**
* @desc Deletes default configuration
*/
function f_cfDown() runs on ItsDenm system ItsDenmSystem {
// Initialise secured mode
f_uninitialiseSecuredMode();
unmap(self:acPort, system:acPort);
} // End of function f_cfDown
group altsteps {
/**
* @desc The base default.
*/
[vc_denmDefaultActive] denmPort.receive(mw_denmInd(mw_denmPdu(mw_anyDenm))) {
log("*** " & testcasename() & ": INFO: DENM message received in default ***");
log("*** " & testcasename() & ": ERROR: Received an unexpected message ***");
log("*** " & testcasename() & ": INCONC: Timeout while awaiting reaction of the IUT prior to Upper Tester action ***");
f_selfOrClientSyncAndVerdict("error", e_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! ***");
* @desc The default for handling upper tester messages.
[vc_utDefaultActive] utPort.receive(UtDenmEventInd:?) -> value v_event {
vc_utEvents[lengthof(vc_utEvents)] := v_event;
log("*** " & testcasename() & ": INFO: Received unhandled/unknown UT message from IUT ***");
repeat;
} // end group altsteps
group preambles {
/**
* @desc The default preamble.
*/
function f_prInitialState(
in Scenario p_scenario := e_staticPosition,
in template (value) UtInitialize p_denmInitialize := m_denmInitialize
) runs on ItsDenm return FncRetCode {
f_utInitializeIut(p_denmInitialize);
f_acLoadScenario(valueof(p_scenario));
f_acStartScenario();
return v_ret;
}
} // end group preambles
group postambles {
/**
* @desc The default postamble.
*/
}
/**
* @desc Postamble including cancellation of an event.
berge
committed
* @param p_trigger Indicates if the cancellation have to be raised by the test system(e_ets)
* or at the application layer of the IUT(e_iut).
* @param p_actionId The action ID of the event to be cancelled
function f_poCancelEvent(template (value) Trigger p_trigger, template (value) ActionID p_actionId)
f_sendDenMessage( m_denmCancellation ( p_actionId , f_getTsStationType( ) ) );
f_utTerminateEvent(m_utEventCancellation(p_actionId));
}
f_poDefault();
}
} // end group postambles
group sendFunctions {
/**
* @desc Sends a DEN message
* @param p_sendMsg The DEN message to send.
* @param p_overrideSeqNo Overrides the sequence number with the stored one.
function f_sendDenMessage(template (value) DecentralizedEnvironmentalNotificationMessage p_denm, boolean p_overrideSeqNo := true) runs on ItsDenm return ActionID {
if (p_overrideSeqNo) {
p_denm.management.actionID.sequenceNumber := vc_sequenceNo;
}
denmPort.send(
m_denmReq(
m_denmPdu(
p_denm
)
)
);
}
} // end sendFunctions
group receiveFunctions {
/**
* @param p_rcvMsg The expected message to be received.
* @param p_rcvdMsg The received message - OUT.
*/
function f_awaitDenMessage(in template (present) DenmInd p_rcvMsg, out DenmInd p_rcvdMsg) runs on ItsDenm {
log("*** " & testcasename() & ": INFO: Timeout while awaiting the reception of a message ***");
f_selfOrClientSyncAndVerdict("error", e_timeout);
/**
* @desc Increases the sequence number and handles the special case where the
* sequence number reaches the limit of 65535 and will be reset to 0.
* @param p_sequenceNumber The sequence number to increase.
* @return The increased sequence number.
function f_increaseSequenceNumber(in SequenceNumber p_sequenceNumber) return SequenceNumber {
// if maximum number of 65535 reached, reset it to 0
return ((p_sequenceNumber + 1) mod 65536);
}
} // end group miscellaneousFunctions