module ItsAutoInterop_TestCases { // Libcommon import from LibCommon_VerdictControl all; import from LibCommon_Sync all; import from LibCommon_BasicTypesAndValues all; import from LibCommon_DataStrings all; import from LibCommon_Time all; // LibItsCommon import from LibItsCommon_Functions all; import from LibItsExternal_TypesAndValues all; // LibItsGeoNetworking import from LibItsGeoNetworking_TypesAndValues all; import from LibItsGeoNetworking_Functions all; import from LibItsGeoNetworking_Templates all; import from LibItsGeoNetworking_Pixits all; import from LibItsGeoNetworking_TestSystem all; // AtsInterop import from ItsAutoInterop_TypesAndValues all; import from ItsAutoInterop_Templates all; import from ItsAutoInterop_Functions all; import from ItsAutoInterop_Pics all; import from ItsAutoInterop_Pixits all; import from ItsAutoInterop_TestSystem all; /** * @desc Verify complete forwarding message scenario (GREEDY, GREEDY, GREEDY) *
* Pics Selection: * Config Id: CF-01 * Initial conditions: * with { * itsGnNonAreaForwardingAlgorithm of EUT1 (source) set to GREEDY * itsGnNonAreaForwardingAlgorithm of EUT2 (forwarder) set to GREEDY * itsGnNonAreaForwardingAlgorithm of EUT3 (neighbour) set to GREEDY * itsGnNonAreaForwardingAlgorithm of EUT4 is SIMPLE * } * Expected behaviour: * ensure that { * when { * EUT1 is requested to broadcast DEN message * containing GBC packet * containing Basic Header * containing RHL field * containing DestinationArea * indicating the GEOA_AREA2 * } * then { * EUT1 sends a LL packet * containg a destination MAC address * indicating the EUT2 address * containing GBC packet * containing Basic Header * containing RHL field * containing DestinationArea * indicating the GEOA_AREA2 * containing Payload * containing the DEN message * } * } ** * @see Draft ETSI TS yyy xxx-2 V0.0.8 (2017-02) TD_AUTO_IOT_DENM_MFW_BV_01 * @reference ETSI EN 302 636-4-1 Clauses D & E2 */ testcase TC_AUTO_IOT_DENM_MFW_BV_01() runs on ItsMtc system ItsAutoInteropGeoNetworkingSystem { // Local variables var ItsAutoInteropGeonetworking v_eut1; var ItsAutoInteropGeonetworking v_eut2; var ItsAutoInteropGeonetworking v_eut3; var ItsAutoInteropGeonetworking v_eut4; // Test control /*if (not PICS_GN_LS_FWD) { log("*** " & testcasename() & ": PICS_GN_LS_FWD required for executing the TC ***"); setverdict(inconc); stop; }*/ // Test component configuration f_cfMtc04Up(v_eut1, v_eut2, v_eut3, v_eut4); // Preamble // Start components v_eut1.start(f_TC_AUTO_IOT_DENM_MFW_BV_01_eut1(v_eut1, 0)); v_eut2.start(f_TC_AUTO_IOT_DENM_MFW_BV_01_eut2(v_eut2, 1)); v_eut3.start(f_TC_AUTO_IOT_DENM_MFW_BV_01_eut3(v_eut3, 2)); v_eut4.start(f_TC_AUTO_IOT_DENM_MFW_BV_01_eut4(v_eut4, 3)); // Synchronization f_serverSyncNClientsAndStop(4, {c_prDone, c_tbDone, c_poDone}); // Cleanup f_cfMtc04Down(v_eut1, v_eut2, v_eut3, v_eut4); } // End of TC_AUTO_IOT_DENM_MFW_BV_01 group g_TC_AUTO_IOT_DENM_MFW_BV_01 { /** * @desc Behavior function for EUT1 (TC_AUTO_IOT_DENM_MFW_BV_01) */ function f_TC_AUTO_IOT_DENM_MFW_BV_01_eut1( in ItsAutoInteropGeonetworking p_eut, in integer p_eut_id ) runs on ItsAutoInteropGeonetworking { // Local variables var GeoNetworkingInd v_gnInd; var template (value) Payload v_payload; // Test component configuration f_cfPtcUp(p_eut); // Preamble f_prDefault(); f_selfOrClientSyncAndVerdict(c_prDone, e_success); // Test Body tc_ac.start; alt { [] geoNetworkingPort.receive( // Filter broadcasted DENM mw_geoNwInd_withLinkLayerDestination( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_denm( ?, ?, e_btpB, mw_denm_stationId( PX_EUT_DESC[p_eut_id].stationId ))), PX_EUT_DESC[1].ll_mac_address )) -> value v_gnInd { // Receives the triggered DENM message tc_ac.stop; // Re-send DEN message to EUT2s eutGeoNetworkingPort.send( m_forward_geoNetworkingInd( v_gnInd )); tc_ac.start; repeat; } [] geoNetworkingPort.receive( mw_geoNwInd_withLinkLayerDestination( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_denm( ?, ?, e_btpB, mw_denm_stationId( complement(PX_EUT_DESC[p_eut_id].stationId) ))), ? )) -> value v_gnInd { // Receives a broadcast MAC address tc_ac.stop; log("*** " & testcasename() & ": FAIL: Unexpected DEN message received ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); } // TODO Check unexpected messages on eutGeoNetworkingPort port [] eutGeoNetworkingPort.receive { // TODO Use a default tc_ac.stop; tc_ac.start; repeat; } [] geoNetworkingPort.receive { // TODO Use a default tc_ac.stop; tc_ac.start; repeat; } [] tc_ac.timeout { log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, GREEDY) succeed ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_success); } } // Postamble f_poDefault(); f_cfPtcDown(p_eut); } // End of f_TC_AUTO_IOT_DENM_MFW_BV_01_eut1 /** * @desc Behavior function for EUT2 (TC_AUTO_IOT_DENM_MFW_BV_01) */ function f_TC_AUTO_IOT_DENM_MFW_BV_01_eut2( in ItsAutoInteropGeonetworking p_eut, in integer p_eut_id ) runs on ItsAutoInteropGeonetworking { // Local variables var EutGeoNetworking v_eutGeoNw; // Test component configuration f_cfPtcUp(p_eut); // Preamble f_prNeighbour(); f_selfOrClientSyncAndVerdict(c_prDone, e_success); // Test Body tc_ac.start; alt { [] eutGeoNetworkingPort.receive( mw_eutGeoNwInd( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_denm( ?, ?, e_btpB, mw_denm_stationId( PX_EUT_DESC[0].stationId ))))) -> value v_eutGeoNw { // Unexpected DEN message tc_ac.stop; // Now, we have to check for EUT4 to broadcast the DENM message tc_ac.start; repeat; } [] eutGeoNetworkingPort.receive( mw_eutGeoNwInd_withLinkLayerDestination( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_denm( ?, ?, e_btpB, mw_denm_stationId( PX_EUT_DESC[3].stationId ))), c_llBroadcast )) -> value v_eutGeoNw { // Receives a broadcast MAC address from EUT4 tc_ac.stop; log("*** " & testcasename() & ": PASS: DEN message was broadcasted by EUT4 ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_success); } [] eutGeoNetworkingPort.receive { // TODO Use a default tc_ac.stop; tc_ac.start; repeat; } [] geoNetworkingPort.receive { // TODO Use a default tc_ac.stop; tc_ac.start; repeat; } [] tc_ac.timeout { log("*** " & testcasename() & ": FAIL: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is incomplete ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); } } // End of 'alt' statement // Postamble f_poDefault(); f_cfPtcDown(p_eut); } // End of f_TC_AUTO_IOT_DENM_MFW_BV_01_eut2 /** * @desc Behavior function for EUT3 (TC_AUTO_IOT_DENM_MFW_BV_01) */ function f_TC_AUTO_IOT_DENM_MFW_BV_01_eut3( in ItsAutoInteropGeonetworking p_eut, in integer p_eut_id ) runs on ItsAutoInteropGeonetworking { // Local variables var EutGeoNetworking v_eutGeoNw; // Test component configuration f_cfPtcUp(p_eut); // Preamble f_prNeighbour(); f_selfOrClientSyncAndVerdict(c_prDone, e_success); // Test Body tc_ac.start; alt { [] eutGeoNetworkingPort.receive( mw_eutGeoNwInd_withLinkLayerDestination( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_denm( ?, ?, e_btpB, mw_denm_stationId( PX_EUT_DESC[3].stationId ))), c_llBroadcast )) -> value v_eutGeoNw { // Receives a broadcast MAC address from EUT4 tc_ac.stop; log("*** " & testcasename() & ": PASS: DEN message was broadcasted by EUT4 ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_success); } [] eutGeoNetworkingPort.receive { // TODO Use a default tc_ac.stop; tc_ac.start; repeat; } [] geoNetworkingPort.receive { // TODO Use a default tc_ac.stop; tc_ac.start; repeat; } [] tc_ac.timeout { log("*** " & testcasename() & ": FAIL: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is incomplete ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); } } // End of 'alt' statement // Postamble f_poDefault(); f_cfPtcDown(p_eut); } // End of f_TC_AUTO_IOT_DENM_MFW_BV_01_eut3 /** * @desc Behavior function for EUT4 (TC_AUTO_IOT_DENM_MFW_BV_01) */ function f_TC_AUTO_IOT_DENM_MFW_BV_01_eut4( in ItsAutoInteropGeonetworking p_eut, in integer p_eut_id ) runs on ItsAutoInteropGeonetworking { // Local variables var GeoNetworkingInd v_gnInd; var EutGeoNetworking v_eutGeoNw; var integer v_denm_counter := 0; // Test component configuration f_cfPtcUp(p_eut); // Preamble f_prNeighbour(); f_selfOrClientSyncAndVerdict(c_prDone, e_success); // Test Body tc_ac.start; alt { [] eutGeoNetworkingPort.receive( mw_eutGeoNwInd_withLinkLayerDestination( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_denm( ?, ?, e_btpB, mw_denm_stationId( PX_EUT_DESC[0].stationId ))), PX_EUT_DESC[p_eut_id].ll_mac_address )) -> value v_eutGeoNw { // Receive a DEN message from EUT2 tc_ac.stop; // Now check that EUT4 brodcasts the DENM message tc_ac.start; repeat; } [] geoNetworkingPort.receive( mw_geoNwInd_withLinkLayerDestination( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_denm( ?, ?, e_btpB, mw_denm_stationId( PX_EUT_DESC[3].stationId ))), c_llBroadcast )) -> value v_gnInd { // EUT4 has brodcasted the DENM message tc_ac.stop; // Re-send DEN message to the other EUTs eutGeoNetworkingPort.send( m_forward_geoNetworkingInd( v_gnInd )); log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, GREEDY) succeed ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_success); } [] eutGeoNetworkingPort.receive { // TODO Use a default tc_ac.stop; tc_ac.start; repeat; } [] geoNetworkingPort.receive { // TODO Use a default tc_ac.stop; tc_ac.start; repeat; } [] tc_ac.timeout { log("*** " & testcasename() & ": FAIL: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is incomplete ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); } } // End of 'alt' statement // Postamble f_poDefault(); f_cfPtcDown(p_eut); } // End of f_TC_AUTO_IOT_DENM_MFW_BV_01_eut4 } // End of group g_TC_AUTO_IOT_DENM_MFW_BV_01 /** * @desc Verify complete Road Works Warning scenario *
* Pics Selection: * Config Id: CF-02 * Initial conditions: * with { * EUT1 sends Road Work Warning DEN messages D1 * containing a ‘speedLimit’ * indicating the value 30 * containing a ‘drivingLaneStatus’ * indicating the value ‘0001’B * containing a ‘trafficFlowRule’ * indicating the value ‘passToRight’ * and EUT1 sends a DEN message D2 * containing a ‘speedLimit’ * indicating the value 30 * containing a ‘drivingLaneStatus’ * indicating the value ‘0011’B * containing a ‘trafficFlowRule * indicating the value ‘passToRight’ * and EUT1 sends a DEN message D3 * containing a ‘speedLimit’ * indicating the value 30 * containing a ‘drivingLaneStatus’ * indicating the value ‘0101’B * containing a ‘trafficFlowRule’ * indicating the value ‘passToLeft’ * and EUT2 (vehicle) receives the DEN messages D1, D2 and D3 * } * Expected behaviour: * ensure that { * when { * EUT2 (vehicle) reaches the position POS0 * } * then { * EUT2 (vehicle) already indicates the speed limit information * } * when { * EUT2 (vehicle) reaches the position POS1 * } * then { * EUT2 (vehicle) still indicates the speed limit information * and EUT2 (vehicle) already indicates the most outer lane closed * and EUT2 (vehicle) already indicates the hardshoulder opened * } * when { * EUT2 (vehicle) reaches the position POS2 * } * then { * EUT2 (vehicle) still indicates the speed limit information * and EUT2 (vehicle) already indicates the two most outer lanes closed * and EUT2 (vehicle) already indicates the hardshoulder opened * } * when { * EUT2 (vehicle) reaches the position POS3 * } * then { * EUT2 (vehicle) still indicates the speed limit information * and EUT2 (vehicle) already indicates the most right lane closed * and EUT2 (vehicle) already indicates the hardshoulder closed * } * when { * EUT2 (vehicle) reaches the position POS4 * } * then { * EUT2 (vehicle) stops indicating the speed limit information * and EUT2 (vehicle) stops indicating the lanes status * } * } ** * @see Draft ETSI TS yyy xxx-2 V0.0.8 (2017-02) TD_AUTO_IOT_DENM_RWW_BV_01 * @reference ETSI EN 302 637-3 [5] */ testcase TC_AUTO_IOT_DENM_RWW_BV_01() runs on ItsMtc system ItsAutoInteropGeoNetworkingSystem { // Local variables var ItsAutoInteropGeonetworking v_eut1; var ItsAutoInteropGeonetworking v_eut2; // Test control /*if (not PICS_GN_LS_FWD) { log("*** " & testcasename() & ": PICS_GN_LS_FWD required for executing the TC ***"); setverdict(inconc); stop; }*/ // Test component configuration ItsAutoInterop_Functions.f_cf02Up(v_eut1, v_eut2); // Preamble // Start components v_eut1.start(f_TC_AUTO_IOT_DENM_RWW_BV_01_eut1(v_eut1, 0)); v_eut2.start(f_TC_AUTO_IOT_DENM_RWW_BV_01_eut2(v_eut2, 1)); // Synchronization f_serverSyncNClientsAndStop(2, {c_prDone, c_tbDone, c_poDone}); // Cleanup ItsAutoInterop_Functions.f_cf02Down(v_eut1, v_eut2); } // End of TC_AUTO_IOT_DENM_RWW_BV_01 group g_TC_AUTO_IOT_DENM_RWW_BV_01 { /** * @desc Behavior function for EUT1 (TD_AUTO_IOT_DENM_RWW_BV_01) */ function f_TC_AUTO_IOT_DENM_RWW_BV_01_eut1( in ItsAutoInteropGeonetworking p_eut, in integer p_eut_id ) runs on ItsAutoInteropGeonetworking { // Local variables var GeoNetworkingInd v_gnInd; // Test component configuration f_cfPtcUp(p_eut); // Preamble f_prNeighbour(); // Nothing to do f_selfOrClientSyncAndVerdict(c_prDone, e_success); // Test Body tc_ac.start; alt { [] geoNetworkingPort.receive( mw_geoNwInd( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_denm( ?, ?, e_btpB, mw_denm_stationId( PX_EUT_DESC[p_eut_id].stationId ))))) -> value v_gnInd { // Receive a DEN message tc_ac.stop; // Re-send DEN message to the other EUTs eutGeoNetworkingPort.send( m_forward_geoNetworkingInd( v_gnInd )); tc_ac.start; repeat; } [] tc_ac.timeout { log("*** " & testcasename() & ": PASS: Test done ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_success); } } // End of 'alt' statement // Postamble f_poDefault(); f_cfPtcDown(p_eut); } // End of f_TC_AUTO_IOT_DENM_RWW_BV_01_eut1 /** * @desc Behavior function for EUT2 (TD_AUTO_IOT_DENM_RWW_BV_01) */ function f_TC_AUTO_IOT_DENM_RWW_BV_01_eut2( in ItsAutoInteropGeonetworking p_eut, in integer p_eut_id ) runs on ItsAutoInteropGeonetworking { // Local variables var GeoNetworkingInd v_gnInd; var EutGeoNetworking v_eutGeoNw; var HmiSignageEventInd v_hmiSignageEventInd; var integer v_counter; var integer is_on_position := -1; // Set to unknown position // Test component configuration f_cfPtcUp(p_eut); // Preamble f_prNeighbour(); // Wait for EUT_1 DEN messages v_counter := 0; tc_ac.start; alt { [] eutGeoNetworkingPort.receive( mw_eutGeoNwInd( mw_geoNwPdu( mw_geoNwTsbPacketWithNextHeader_denm( ?, ?, e_btpB, mw_denm_stationId )))) -> value v_eutGeoNw { // Receive a DEN message tc_ac.stop; v_counter := v_counter + 1; if (v_counter < 3) { tc_ac.start; } else { log("*** " & testcasename() & ": INFO: EUT2 (vehicle) does not receive RWW DENMs D1, D2 and D3 ***"); f_selfOrClientSyncAndVerdict(c_prDone, e_success); } } [] tc_ac.timeout { log("*** " & testcasename() & ":FAIL: EUT2 (vehicle) does not receive RWW DENMs D1, D2 and D3 ***"); f_selfOrClientSyncAndVerdict(c_prDone, e_error); } } // End of 'alt' statement // Test Body tc_wait.start; alt { [] geoNetworkingPort.receive( mw_geoNwInd_withLinkLayerDestination( mw_geoNwPdu( mw_geoNwShbPacketWithNextHeader_cam( ?, ?, e_btpB, mw_cam_stationId( -, PX_EUT_DESC[p_eut_id].stationId ))), c_llBroadcast )) -> value v_gnInd { // Receives a broadcast MAC address // TODO Compute position using PositionVector // TODO Set the correct step repeat; } [is_on_position == 0] hmiPort.receive( HmiSignageEventInd:?/*TODO*/ ) -> value v_hmiSignageEventInd { } [is_on_position == 1] hmiPort.receive( HmiSignageEventInd:?/*TODO*/ ) -> value v_hmiSignageEventInd { } [is_on_position == 2] hmiPort.receive( HmiSignageEventInd:?/*TODO*/ ) -> value v_hmiSignageEventInd { } [is_on_position == 3] hmiPort.receive( HmiSignageEventInd:?/*TODO*/ ) -> value v_hmiSignageEventInd { } [] eutGeoNetworkingPort.receive { // TODO Use default repeat; } [] geoNetworkingPort.receive { // TODO Use default // Nothing to do repeat; } [] tc_wait.timeout { log("*** " & testcasename() & ": PASS: Road Works Warning scenario completed ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_success); } } // End of 'alt' statement // Postamble f_poDefault(); f_cfPtcDown(p_eut); } // End of f_TC_AUTO_IOT_DENM_RWW_BV_01_eut2 } // End of group g_TC_AUTO_IOT_DENM_RWW_BV_01 /** * @desc Verify complete neighbors detection scenario based on CA messages and/or beacons *
* Pics Selection: * Config Id: CF-03 * Initial conditions: * with { * EUT1 sends CA messages C1 * containing cam * containing camParameters * containing basicContainer * containing referencePosition * indicating POSITION_1 * and EUT2 sends a CA message C2 * containing cam * containing camParameters * containing basicContainer * containing referencePosition * indicating POSITION_2 * and EUT3 sends a CA message C3 * containing cam * containing camParameters * containing basicContainer * containing referencePosition * indicating POSITION_3 * } * Expected behaviour: * ensure that { * when { * EUT1 receives C2 * } * then { * EUT1 still indicates EUT2 as neighbor * } * when { * EUT1 receives C3 * } * then { * EUT1 still indicates EUT3 as neighbor * } * when { * EUT2 receives C1 * } * then { * EUT2 still indicates EUT1 as neighbor * } * when { * EUT2 receives C3 * } * then { * EUT2 still indicates EUT3 as neighbor * } * when { * EUT3 receives C1 * } * then { * EUT3 still indicates EUT1 as neighbor * } * when { * EUT3 receives C2 * } * then { * EUT3 still indicates EUT2 as neighbor * } * } ** * @see Draft ETSI TS yyy xxx-2 V0.0.8 (2017-02) TD_AUTO_IOT_CAM_NBD_BV_01 * @reference ETSI EN 302 636-2 ETSI EN 302 637-2 [4] */ testcase TC_AUTO_IOT_CAM_NBD_BV_01() runs on ItsMtc system ItsAutoInteropGeoNetworkingSystem { // Local variables var ItsAutoInteropGeonetworking v_eut1; var ItsAutoInteropGeonetworking v_eut2; var ItsAutoInteropGeonetworking v_eut3; // Test control /*if (not PICS_GN_LS_FWD) { log("*** " & testcasename() & ": PICS_GN_LS_FWD required for executing the TC ***"); setverdict(inconc); stop; }*/ // Test component configuration ItsAutoInterop_Functions.f_cf03Up(v_eut1, v_eut2, v_eut3); // Preamble // Start components v_eut1.start(f_TC_AUTO_IOT_CAM_NBD_BV_01_eut(v_eut1, 0)); v_eut2.start(f_TC_AUTO_IOT_CAM_NBD_BV_01_eut(v_eut2, 1)); v_eut3.start(f_TC_AUTO_IOT_CAM_NBD_BV_01_eut(v_eut3, 2)); // Synchronization f_serverSyncNClientsAndStop(3, {c_prDone, c_tbDone, c_poDone}); // Cleanup ItsAutoInterop_Functions.f_cf03Down(v_eut1, v_eut2, v_eut3); } // End of TC_AUTO_IOT_CAM_NBD_BV_01 group g_TC_AUTO_IOT_CAM_NBD_BV_01 { /** * @desc Behavior function for EUT (TD_AUTO_IOT_CAM_NBD_BV_01) */ function f_TC_AUTO_IOT_CAM_NBD_BV_01_eut( in ItsAutoInteropGeonetworking p_eut, in integer p_eut_id ) runs on ItsAutoInteropGeonetworking { // Local variables var GeoNetworkingInd v_gnInd; var HmiNeighborEventInd v_hmiNeighborEventInd; var HmiNeighborEventInds v_expected_neighbors := {}; // Build the list of the expected neighbors for (var integer i := 0; i < lengthof(PX_EUT_DESC); i := i + 1) { if (i != p_eut_id) { var octetstring v := int2oct(PX_EUT_DESC[i].stationId, 4); // FIXME How to improve type conversion v_expected_neighbors[lengthof(v_expected_neighbors)].mid := PX_EUT_DESC[i].mid; v_expected_neighbors[lengthof(v_expected_neighbors)].stationId := oct2int(v); // FIXME How to improve type conversion } } // End of 'for' statement // Test component configuration f_cfPtcUp(p_eut); // Preamble f_prDefault(); f_selfOrClientSyncAndVerdict(c_prDone, e_success); // Test Body tc_wait.start; alt { // TODO Add beacon support [] geoNetworkingPort.receive( // Filter broadcasted CAM mw_geoNwInd_withLinkLayerDestination( mw_geoNwPdu( mw_geoNwShbPacketWithNextHeader_cam( ?, ?, e_btpB, mw_cam_stationId( -, complement(PX_EUT_DESC[p_eut_id].stationId) ))), c_llBroadcast )) -> value v_gnInd { // Receives a broadcast MAC address // Broadcast CA message to the other EUTs eutGeoNetworkingPort.send( m_forward_geoNetworkingInd( v_gnInd )); repeat; } [] eutGeoNetworkingPort.receive( mw_eutGeoNwInd_withLinkLayerDestination( mw_geoNwPdu( mw_geoNwShbPacketWithNextHeader_cam( ?, ?, e_btpB, mw_cam_stationId( -, PX_EUT_DESC[p_eut_id].stationId ))), c_llBroadcast )) { // Receives a broadcast MAC address // Receive CAM from other EUTs repeat; } [] hmiPort.receive( HmiNeighborEventInd:?/*TODO*/ ) -> value v_hmiNeighborEventInd { if (match(v_expected_neighbors, superset(m_hmiNeighborEventInd(v_hmiNeighborEventInd.mid, v_hmiNeighborEventInd.stationId)))) { // Remove item for (var integer i := 0; i < lengthof(v_expected_neighbors); i := i + 1) { if (v_expected_neighbors[i].mid == v_hmiNeighborEventInd.mid) { v_expected_neighbors[i] := {}; break; } } } // else nothing to do // Check if all neighbors were detected if (lengthof(v_expected_neighbors) == 0) { log("*** " & testcasename() & ": PASS: Neighbors were detected by EUT #", p_eut_id, " ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_success); } else { repeat; } } [] tc_wait.timeout { log("*** " & testcasename() & ": FAIL: Neighbors were not be detected by EUT #", p_eut_id, " ***"); } } // End of 'alt' statement // Postamble f_poDefault(); f_cfPtcDown(p_eut); } // End of f_TC_AUTO_IOT_CAM_NBD_BV_01_eut } // End of group g_TC_AUTO_IOT_CAM_NBD_BV_01 } // End of module AtsInterop_TestCases