ItsAutoInterop_TestCases.ttcn 171 KB
Newer Older
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;
  // LibIts
  import from ITS_Container language "ASN.1:1997" all;
  import from IEEE1609dot2BaseTypes language "ASN.1:1997" all;
  import from IEEE1609dot2 language "ASN.1:1997" all;
  import from EtsiTs103097Module language "ASN.1:1997" all;
  import from DENM_PDU_Descriptions language "ASN.1:1997" all; // TODO To be removed
  // LibItsCommon
  import from LibItsCommon_TestSystem all;
  import from LibItsCommon_Functions all;
  import from LibItsExternal_TypesAndValues all;
  import from LibItsCommon_ASN1_NamedNumbers all;
  // LibItsGeoNetworking
  import from LibItsGeoNetworking_TypesAndValues all;
  import from LibItsGeoNetworking_Templates all;
  import from LibItsGeoNetworking_Pixits all;
  import from LibItsGeoNetworking_TestSystem all;
  // LibItsGeoNetworking
  import from LibItsDenm_Templates all;
  // LibItsSecurity
  import from LibItsSecurity_TypesAndValues all;
garciay's avatar
garciay committed
    
  // 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) 
   * <pre>
   * Pics Selection: 
   * Config Id: CF-01
   * Initial conditions:
   *  with {
   *      itsGnNonAreaForwardingAlgorithm of EUT1 set to GREEDY
   *      itsGnNonAreaForwardingAlgorithm of EUT2 set to GREEDY
   *      itsGnNonAreaForwardingAlgorithm of EUT3 set to GREEDY
   *      itsGnNonAreaForwardingAlgorithm of EUT4 is SIMPLE
   *  }
   * Expected behaviour:
   *  ensure that {
   *      when {
   *          EUT1 is requested to send DEN message
   *              encapsulated in a GBC packet
   *          containing Basic Header
   *              containing RHL field
   *                  indicating a value > 1
   *          containing DestinationArea
   *              indicating the TARGET_GEOAREA
   *      }
   *      then {
   *          EUT1 sends a GBC packet
   *              containing Basic Header
   *                  containing RHL field
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *                  containing the DEN message
   *              encapsulated in a LL packet
   *                  containing a destination MAC address
   *                      indicating the EUT2 address
   *      }
   *      when {
   *          EUT2 receives the GBC packet from EUT1
   *      }
   *      then {
   *          EUT2 sends a GBC packet
   *              containing Basic Header
   *                  containing RHL field
   *                      indicating value decreased by 1
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *                  containing the DEN message
   *              encapsulated in a LL packet
   *                  containing a destination MAC address
   *                      indicating the EUT4 address
   *              and EUT3 does not receive the GBC packet from EUT1
   *      }
   *      when {
   *          EUT4 receives the GBC packet from EUT2
   *              containing Basic Header
   *              containing RHL field
   *                  indicating value decreased by 1
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *                  containing the DEN message
   *      }
   *      then {
   *          EUT4 provides the DEN message to upper layers 
   *          and EUT4 sends a GBC packet
   *              containing Basic Header
   *                  containing RHL field
   *                      indicating value decreased by 1
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *              containing the DEN message
   *              encapsulated in a LL packet 
   *                  containing a destination MAC address
   *                      indicating broadcast address
   *      }
   *      when {
   *      EUT2 receives the GBC packet from EUT4
   *      }
   *      then {
   *          EUT2 discards the GBC packet
   *      }
   *      when {
   *          EUT3 receives the GBC packet from EUT4
   *      }
   *      then {
   *          EUT3 discards the GBC packet
   *      }
   *  }
   * </pre>
   *
   * @see         Draft ETSI TS yyy xxx-2 V0.0.8 (2017-03) 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 := null;
    var ItsAutoInteropGeonetworking v_eut2 := null;
    var ItsAutoInteropGeonetworking v_eut3 := null;
    var ItsAutoInteropGeonetworking v_eut4 := null;
        
    // 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_mtcCf01Up(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, PX_EUT1_ID));
    v_eut2.start(f_TC_AUTO_IOT_DENM_MFW_BV_01_eut2(v_eut2, PX_EUT2_ID));
    v_eut3.start(f_TC_AUTO_IOT_DENM_MFW_BV_01_eut3(v_eut3, PX_EUT3_ID));
    v_eut4.start(f_TC_AUTO_IOT_DENM_MFW_BV_01_eut4(v_eut4, PX_EUT4_ID));
        
    // Synchronization
    f_serverSyncNClientsAndStop(4, {c_prDone, c_tbDone});
        
    // Cleanup
    f_mtcCf01Down(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
            
      // Test component configuration
      f_cfPtcUp(p_eut);
            
      // Preamble
      f_prDefault();
      tc_ac.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT1 is requested to send DEN message
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            mw_longPosVector(
                                                                                                                                                             PICS_TARGET_GEOAREA
                                                                                                                                                             ),
                                                                                                                                            ?,
                                                                                                                                            e_btpB, 
                                                                                                                                            ?/*mw_denm_stationId(
                                                                                                                                               PX_EUT_DESC[p_eut_id].stationId
                                                                                                                                               )*/)),
                                                                                PX_EUT_DESC[PX_EUT2_ID].ll_mac_address
                                                                                )) { //  Receives the triggered DENM message
          tc_ac.stop;
          log("*** " & testcasename() & ": INFO: EUT1 sends a GBC packet ***");
          f_selfOrClientSyncAndVerdict(c_prDone, e_success);
        }
        [] tc_ac.timeout {
          log("*** " & testcasename() & ": INCONC: EUT1 does not send the requested DEN message ***");
          f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
        }
      } // End of 'alt' statement
            
      // Test Body
      tc_wait.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT1 shall not receive any more DEN messages
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            ?,
                                                                                                                                            ?,
                                                                                                                                            e_btpB, 
                                                                                                                                            ?/*mw_denm_stationId(
                                                                                                                                               ? // FIXME complement(PX_EUT_DESC[p_eut_id].stationId)
                                                                                                                                               )*/)),
                                                                                ?
                                                                                )) { 
          tc_wait.stop;
          log("*** " & testcasename() & ": FAIL: Unexpected DEN message received ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
        [] tc_wait.timeout {
          log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, GREEDY) succeed ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
        }
      } // End of 'alt' statement
            
      // 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_prDefault();
      f_selfOrClientSyncAndVerdict(c_prDone, e_success);
            
      // Test Body
      tc_wait.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT2 receives the GBC packet from EUT1
                                        mw_eutGeoNwInd(
                                                       mw_geoNwPdu(
                                                                   mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                   mw_longPosVector(
                                                                                                                                    PICS_TARGET_GEOAREA
                                                                                                                                    ),
                                                                                                                   ?,
                                                                                                                   e_btpB,
                                                                                                                   ?/*mw_denm_stationId(
                                                                                                                      PX_EUT_DESC[PX_EUT1_ID].stationId
                                                                                                                      )*/)))) -> value v_eutGeoNw {
          // Now, we have to check for EUT4 to broadcast the DENM message
          repeat;
        }
        [] eutGeoNetworkingPort.receive( // EUT2 receives the GBC packet from EUT4
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            ?,
                                                                                                                                            ?,
                                                                                                                                            e_btpB, 
                                                                                                                                            ?/*mw_denm_stationId(
                                                                                                                                               PX_EUT_DESC[PX_EUT4_ID].stationId
                                                                                                                                               )*/)),
                                                                                c_llBroadcast
                                                                                )) -> value v_eutGeoNw { 
          tc_wait.stop;
          log("*** " & testcasename() & ": INFO: EUT2 receives the GBC packet from EUT4 ***");
        }
        [] tc_wait.timeout {
          log("*** " & testcasename() & ": FAIL: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is incomplete ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
      } // End of 'alt' statement
      // EUT2 discards the GBC packet
      f_sleep(PX_TNOAC);
      if(0 < lengthof(vc_utInds)) {
        log("*** " & testcasename() & ": INCONC: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is incomplete ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
      }
      else {
        log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is succeed ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
      }
            
      // 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_prDefault();
      f_selfOrClientSyncAndVerdict(c_prDone, e_success);
            
      // Test Body
      tc_wait.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT3 receives the GBC packet from EUT4
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            ?,
                                                                                                                                            ?,
                                                                                                                                            e_btpB, 
                                                                                                                                            ?//mw_denm_stationId
                                                                                                                                            )),
                                                                                ?
                                                                                )) -> value v_eutGeoNw { 
          tc_wait.stop;
          log("*** " & testcasename() & ": INFO: EUT3 received DEN message from EUT ", v_eutGeoNw.msg.gnPacket.packet.extendedHeader.tsbHeader.srcPosVector.gnAddr.mid, " ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
        [] tc_wait.timeout {
          log("*** " & testcasename() & ": FAIL: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is incomplete ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
      } // End of 'alt' statement
      // EUT3 discards the GBC packet
      f_sleep(PX_TNOAC);
      if(0 < lengthof(vc_utInds)) {
        log("*** " & testcasename() & ": INCONC: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is incomplete ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
      }
      else {
        log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is succeed ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
      }
            
      // Postamble
      f_poDefault();
      f_cfPtcDown(p_eut);
            
    } // End of f_TC_AUTO_IOT_DENM_MFW_BV_01_eut3
garciay's avatar
garciay committed
        
    /**
     * @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 EutGeoNetworking v_eutGeoNw;
            
      // Test component configuration
      f_cfPtcUp(p_eut);
            
      // Preamble
      f_prDefault();
      f_selfOrClientSyncAndVerdict(c_prDone, e_success);
            
      // Test Body
      tc_wait.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT4 receives the GBC packet from EUT2
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            mw_longPosVector(
                                                                                                                                                             PICS_TARGET_GEOAREA
                                                                                                                                                             ),
                                                                                                                                            ?,
                                                                                                                                            e_btpB,
                                                                                                                                            ?//mw_denm_stationId
                                                                                                                                            )),
                                                                                PX_EUT_DESC[p_eut_id].ll_mac_address
                                                                                )) -> value v_eutGeoNw { // Receive a DEN message from EUT2
          tc_wait.stop;
          // Now check that EUT4 brodcasts the DENM message
          log("*** " & testcasename() & ": INFO: EUT4 receives the GBC packet from EUT2 ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
        }
        [] tc_wait.timeout {
          log("*** " & testcasename() & ": FAIL: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is incomplete ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
      } // End of 'alt' statement
      // EUT4 provides the DEN message to upper layers 
      f_sleep(PX_TNOAC);
      if(0 < lengthof(vc_utInds)) {
        log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is succeed ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
      }
      else {
        log("*** " & testcasename() & ": INCONC: EUT4 does not provide the DEN message to upper layers ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
      }
            
      // 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
garciay's avatar
garciay committed
    
    /**
     * @desc    Verify complete forwarding message scenario (GREEDY, GREEDY, CBF) 
     * <pre>
     * Pics Selection: 
     * Config Id: CF-01
     * Initial conditions:
     *  with {
     *      itsGnNonAreaForwardingAlgorithm of EUT1 set to GREEDY
     *      itsGnNonAreaForwardingAlgorithm of EUT2 set to GREEDY
     *      itsGnNonAreaForwardingAlgorithm of EUT3 set to CBF
     *      itsGnNonAreaForwardingAlgorithm of EUT4 is SIMPLE
     *  }
     * Expected behaviour:
     *  ensure that {
     *      when {
     *          EUT1 is requested to send DEN message
     *              encapsulated in a GBC packet
     *          containing Basic Header
     *              containing RHL field
     *                  indicating a value > 1
     *          containing DestinationArea
     *              indicating the TARGET_GEOAREA
     *      }
     *      then {
     *          EUT1 sends a GBC packet
     *              containing Basic Header
     *                  containing RHL field
     *              containing DestinationArea
     *                  indicating the TARGET_GEOAREA
     *              containing Payload
     *                  containing the DEN message
     *              encapsulated in a LL packet
     *                  containing a destination MAC address
     *                      indicating the EUT2 address
     *      }
     *      when {
     *          EUT2 receives the GBC packet from EUT1
     *      }
     *      then {
     *          EUT2 sends a GBC packet
     *              containing Basic Header
     *                  containing RHL field
     *                      indicating value decreased by 1
     *              containing DestinationArea
     *                  indicating the TARGET_GEOAREA
     *              containing Payload
     *                  containing the DEN message
     *              encapsulated in a LL packet
     *                  containing a destination MAC address
     *                      indicating the EUT4 address
     *              and EUT3 does not receive the GBC packet from EUT1
     *      }
     *      when {
     *          EUT4 receives the GBC packet from EUT2
     *              containing Basic Header
     *              containing RHL field
     *                  indicating value decreased by 1
     *              containing DestinationArea
     *                  indicating the TARGET_GEOAREA
     *              containing Payload
     *                  containing the DEN message
     *      }
     *      then {
     *          EUT4 provides the DEN message to upper layers 
     *          and EUT4 sends a GBC packet
     *              containing Basic Header
     *                  containing RHL field
     *                      indicating value decreased by 1
     *              containing DestinationArea
     *                  indicating the TARGET_GEOAREA
     *              containing Payload
     *              containing the DEN message
     *              encapsulated in a LL packet 
     *                  containing a destination MAC address
     *                      indicating broadcast address
     *      }
     *      when {
     *      EUT2 receives the GBC packet from EUT4
     *      }
     *      then {
     *          EUT2 discards the GBC packet
     *      }
     *      when {
     *          EUT3 receives the GBC packet from EUT4
     *      }
     *      then {
     *          EUT3 discards the GBC packet
     *      }
     *  }
     * </pre>
     *
     * @see         Draft ETSI TS yyy xxx-2 V0.0.8 (2017-03) TD_AUTO_IOT_DENM_MFW_BV_02
     * @reference   ETSI EN 302 636-4-1 Clauses D & E2
     */
  testcase TC_AUTO_IOT_DENM_MFW_BV_02() runs on ItsMtc system ItsAutoInteropGeoNetworkingSystem {
garciay's avatar
garciay committed
        
    // Local variables
    var ItsAutoInteropGeonetworking v_eut1 := null;
    var ItsAutoInteropGeonetworking v_eut2 := null;
    var ItsAutoInteropGeonetworking v_eut3 := null;
    var ItsAutoInteropGeonetworking v_eut4 := null;
garciay's avatar
garciay committed
        
    // Test control
    /*if (not PICS_GN_LS_FWD) {
      log("*** " & testcasename() & ": PICS_GN_LS_FWD required for executing the TC ***");
      setverdict(inconc);
      stop;
      }*/
garciay's avatar
garciay committed
        
    // Test component configuration
    f_mtcCf01Up(v_eut1, v_eut2, v_eut3, v_eut4);
garciay's avatar
garciay committed
        
garciay's avatar
garciay committed
        
    // Start components
    v_eut1.start(f_TC_AUTO_IOT_DENM_MFW_BV_02_eut1(v_eut1, PX_EUT1_ID));
    v_eut2.start(f_TC_AUTO_IOT_DENM_MFW_BV_02_eut2(v_eut2, PX_EUT2_ID));
    v_eut3.start(f_TC_AUTO_IOT_DENM_MFW_BV_02_eut3(v_eut3, PX_EUT3_ID));
    v_eut4.start(f_TC_AUTO_IOT_DENM_MFW_BV_02_eut4(v_eut4, PX_EUT4_ID));
garciay's avatar
garciay committed
        
    // Synchronization
    f_serverSyncNClientsAndStop(4, {c_prDone, c_tbDone});
garciay's avatar
garciay committed
        
    // Cleanup
    f_mtcCf01Down(v_eut1, v_eut2, v_eut3, v_eut4);
garciay's avatar
garciay committed
        
  } // End of TC_AUTO_IOT_DENM_MFW_BV_02
garciay's avatar
garciay committed
    
  group g_TC_AUTO_IOT_DENM_MFW_BV_02 {
    /**
     * @desc    Behavior function for EUT1 (TC_AUTO_IOT_DENM_MFW_BV_02)
garciay's avatar
garciay committed
     */
    function f_TC_AUTO_IOT_DENM_MFW_BV_02_eut1(
                                               in ItsAutoInteropGeonetworking p_eut, 
                                               in integer p_eut_id
                                               ) runs on ItsAutoInteropGeonetworking {
            
      // Local variables
            
      // Test component configuration
      f_cfPtcUp(p_eut);
            
      // Preamble
      f_prDefault();
      tc_ac.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT1 is requested to send DEN message
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            mw_longPosVector(
                                                                                                                                                             PICS_TARGET_GEOAREA
                                                                                                                                                             ),
                                                                                                                                            ?,
                                                                                                                                            e_btpB, 
                                                                                                                                            ?/*mw_denm_stationId(
                                                                                                                                               PX_EUT_DESC[p_eut_id].stationId
                                                                                                                                               )*/)),
                                                                                PX_EUT_DESC[PX_EUT2_ID].ll_mac_address
                                                                                )) { //  Receives the triggered DENM message
          tc_ac.stop;
          log("*** " & testcasename() & ": INFO: EUT1 sends a GBC packet ***");
          f_selfOrClientSyncAndVerdict(c_prDone, e_success);
        }
        [] tc_ac.timeout {
          log("*** " & testcasename() & ": INCONC: EUT1 does not send the requested DEN message ***");
          f_selfOrClientSyncAndVerdict(c_prDone, e_timeout);
        }
      } // End of 'alt' statement
            
      // Test Body
      tc_wait.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT1 shall not receive any more DEN messages
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            ?,
                                                                                                                                            ?,
                                                                                                                                            e_btpB, 
                                                                                                                                            ?/*mw_denm_stationId(
                                                                                                                                               ? // FIXME complement(PX_EUT_DESC[p_eut_id].stationId)
                                                                                                                                               )*/)),
                                                                                ?
                                                                                )) { 
          tc_wait.stop;
          log("*** " & testcasename() & ": FAIL: Unexpected DEN message received ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
        [] tc_wait.timeout {
          log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, CBF) succeed ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
        }
      } // End of 'alt' statement
            
      // Postamble
      f_poDefault();
      f_cfPtcDown(p_eut);
            
    } // End of f_TC_AUTO_IOT_DENM_MFW_BV_02_eut1
garciay's avatar
garciay committed
        
    /**
     * @desc    Behavior function for EUT2 (TC_AUTO_IOT_DENM_MFW_BV_02)
     */
    function f_TC_AUTO_IOT_DENM_MFW_BV_02_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_prDefault();
      f_selfOrClientSyncAndVerdict(c_prDone, e_success);
            
      // Test Body
      tc_wait.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT2 receives the GBC packet from EUT1
                                        mw_eutGeoNwInd(
                                                       mw_geoNwPdu(
                                                                   mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                   mw_longPosVector(
                                                                                                                                    PICS_TARGET_GEOAREA
                                                                                                                                    ),
                                                                                                                   ?,
                                                                                                                   e_btpB,
                                                                                                                   ?/*mw_denm_stationId(
                                                                                                                      PX_EUT_DESC[PX_EUT1_ID].stationId
                                                                                                                      )*/)))) -> value v_eutGeoNw {
          // Now, we have to check for EUT4 to broadcast the DENM message
          repeat;
        }
        [] eutGeoNetworkingPort.receive( // EUT2 receives the GBC packet from EUT4
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            ?,
                                                                                                                                            ?,
                                                                                                                                            e_btpB, 
                                                                                                                                            ?/*mw_denm_stationId(
                                                                                                                                               PX_EUT_DESC[PX_EUT4_ID].stationId
                                                                                                                                               )*/)),
                                                                                c_llBroadcast
                                                                                )) -> value v_eutGeoNw { 
          tc_wait.stop;
          log("*** " & testcasename() & ": INFO: EUT2 receives the GBC packet from EUT4 ***");
        }
        [] tc_wait.timeout {
          log("*** " & testcasename() & ": FAIL: Forwarding message scenario (GREEDY, GREEDY, CBF) is incomplete ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
      } // End of 'alt' statement
      // EUT2 discards the GBC packet
      f_sleep(PX_TNOAC);
      if(0 < lengthof(vc_utInds)) {
        log("*** " & testcasename() & ": INCONC: Forwarding message scenario (GREEDY, GREEDY, CBF) is incomplete ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
      }
      else {
        log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, CBF) is succeed ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
      }
            
      // Postamble
      f_poDefault();
      f_cfPtcDown(p_eut);
            
    } // End of f_TC_AUTO_IOT_DENM_MFW_BV_02_eut2
garciay's avatar
garciay committed
        
    /**
     * @desc    Behavior function for EUT3 (TC_AUTO_IOT_DENM_MFW_BV_02)
     */
    function f_TC_AUTO_IOT_DENM_MFW_BV_02_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_prDefault();
      f_selfOrClientSyncAndVerdict(c_prDone, e_success);
            
      // Test Body
      tc_wait.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT3 receives the GBC packet from EUT4
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            ?,
                                                                                                                                            ?,
                                                                                                                                            e_btpB, 
                                                                                                                                            ?//mw_denm_stationId
                                                                                                                                            )),
                                                                                ?
                                                                                )) -> value v_eutGeoNw { 
          tc_wait.stop;
          log("*** " & testcasename() & ": INFO: EUT3 received DEN message from EUT ", v_eutGeoNw.msg.gnPacket.packet.extendedHeader.tsbHeader.srcPosVector.gnAddr.mid, " ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
        [] tc_wait.timeout {
          log("*** " & testcasename() & ": FAIL: Forwarding message scenario (GREEDY, GREEDY, CBF) is incomplete ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
      } // End of 'alt' statement
      // EUT3 discards the GBC packet
      f_sleep(PX_TNOAC);
      if(0 < lengthof(vc_utInds)) {
        log("*** " & testcasename() & ": INCONC: Forwarding message scenario (GREEDY, GREEDY, CBF) is incomplete ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
      }
      else {
        log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, CBF) is succeed ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
      }
            
      // Postamble
      f_poDefault();
      f_cfPtcDown(p_eut);
            
    } // End of f_TC_AUTO_IOT_DENM_MFW_BV_02_eut3
garciay's avatar
garciay committed
        
    /**
     * @desc    Behavior function for EUT4 (TC_AUTO_IOT_DENM_MFW_BV_02)
     */
    function f_TC_AUTO_IOT_DENM_MFW_BV_02_eut4(
                                               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_prDefault();
      f_selfOrClientSyncAndVerdict(c_prDone, e_success);
            
      // Test Body
      tc_wait.start;
      alt {
        [] eutGeoNetworkingPort.receive( // EUT4 receives the GBC packet from EUT2
                                        mw_eutGeoNwInd_withLinkLayerDestination(
                                                                                mw_geoNwPdu(
                                                                                            mw_geoNwBroadcastPacketWithNextHeaderAndPayload(
                                                                                                                                            mw_longPosVector(
                                                                                                                                                             PICS_TARGET_GEOAREA
                                                                                                                                                             ),
                                                                                                                                            ?,
                                                                                                                                            e_btpB,
                                                                                                                                            ?//mw_denm_stationId
                                                                                                                                            )),
                                                                                PX_EUT_DESC[p_eut_id].ll_mac_address
                                                                                )) -> value v_eutGeoNw { // Receive a DEN message from EUT2
          tc_wait.stop;
          // Now check that EUT4 brodcasts the DENM message
          log("*** " & testcasename() & ": INFO: EUT4 receives the GBC packet from EUT2 ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
        }
        [] tc_wait.timeout {
          log("*** " & testcasename() & ": FAIL: Forwarding message scenario (GREEDY, GREEDY, GREEDY) is incomplete ***");
          f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
        }
      } // End of 'alt' statement
      // EUT4 provides the DEN message to upper layers 
      f_sleep(PX_TNOAC);
      if(0 < lengthof(vc_utInds)) {
        log("*** " & testcasename() & ": PASS: Forwarding message scenario (GREEDY, GREEDY, CBF) is succeed ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
      }
      else {
        log("*** " & testcasename() & ": INCONC: EUT4 does not provide the DEN message to upper layers ***");
        f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
      }
            
      // Postamble
      f_poDefault();
      f_cfPtcDown(p_eut);
            
    } // End of f_TC_AUTO_IOT_DENM_MFW_BV_02_eut4
        
  } // End of group g_TC_AUTO_IOT_DENM_MFW_BV_02
    
  /**
   * @desc    Verify complete forwarding message scenario (GREEDY, CBF, GREEDY) 
   * <pre>
   * Pics Selection: 
   * Config Id: CF-01
   * Initial conditions:
   *  with {
   *      itsGnNonAreaForwardingAlgorithm of EUT1 set to GREEDY
   *      itsGnNonAreaForwardingAlgorithm of EUT2 set to CBF
   *      itsGnNonAreaForwardingAlgorithm of EUT3 set to GREEDY
   *      itsGnNonAreaForwardingAlgorithm of EUT4 is SIMPLE
   *  }
   * Expected behaviour:
   *  ensure that {
   *      when {
   *          EUT1 is requested to send DEN message
   *              encapsulated in a GBC packet
   *          containing Basic Header
   *              containing RHL field
   *                  indicating a value > 1
   *          containing DestinationArea
   *              indicating the TARGET_GEOAREA
   *      }
   *      then {
   *          EUT1 sends a GBC packet
   *              containing Basic Header
   *                  containing RHL field
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *                  containing the DEN message
   *              encapsulated in a LL packet
   *                  containing a destination MAC address
   *                      indicating the EUT2 address
   *      }
   *      when {
   *          EUT2 receives the GBC packet from EUT1
   *      }
   *      then {
   *          EUT2 sends a GBC packet
   *              containing Basic Header
   *                  containing RHL field
   *                      indicating value decreased by 1
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *                  containing the DEN message
   *              encapsulated in a LL packet
   *                  containing a destination MAC address
   *                      indicating broadcast address
   *      }
   *      when {
   *          EUT1 receives the GBC packet from EUT2
   *      }
   *      then {
   *          EUT1 discards the GBC packet
   *      }
   *      when {
   *          EUT4 receives the GBC packet from EUT2
   *              containing Basic Header
   *              containing RHL field
   *                  indicating value decreased by 1
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *                  containing the DEN message
   *      }
   *      then {
   *          EUT4 provides the DEN message to upper layers 
   *          and EUT4 sends a GBC packet
   *              containing Basic Header
   *                  containing RHL field
   *                      indicating value decreased by 1
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *              containing the DEN message
   *              encapsulated in a LL packet 
   *                  containing a destination MAC address
   *                      indicating broadcast address
   *      }
   *      when {
   *          EUT3 received the GBC packet from EUT2
   *              containing Basic Header
   *              containing RHL field
   *                  indicating value decreased by 1
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *                  containing the DEN message
   *      }
   *      then {
   *          EUT3 sends a GBC packet
   *              containing Basic Header
   *                  containing RHL field
   *                      indicating value decreased by 1
   *              containing DestinationArea
   *                  indicating the TARGET_GEOAREA
   *              containing Payload
   *              containing the DEN message
   *              encapsulated in a LL packet 
   *                  containing a destination MAC address
   *                      indicating EUT4 address
   *      }
   *      when {
   *          EUT4 receives the GBC packet from EUT3
   *      }
   *      then {
   *          EUT4 discards the GBC packet (duplicated)
   *      }
   *      when {
   *          EUT3 receives the GBC packet from EUT4
   *      }
   *      then {
   *          EUT3 discards the GBC packet
   *      }
   *      when {
   *          EUT2 receives the GBC packet from EUT4
   *      }
   *      then {
   *          EUT2 discards the GBC packet
   *      }
   *  }
   * </pre>
   *
   * @see         Draft ETSI TS yyy xxx-2 V0.0.8 (2017-03) TD_AUTO_IOT_DENM_MFW_BV_03
   * @reference   ETSI EN 302 636-4-1 Clauses D & E2
   */
  testcase TC_AUTO_IOT_DENM_MFW_BV_03() runs on ItsMtc system ItsAutoInteropGeoNetworkingSystem {
        
    // Local variables
    var ItsAutoInteropGeonetworking v_eut1 := null;
    var ItsAutoInteropGeonetworking v_eut2 := null;
    var ItsAutoInteropGeonetworking v_eut3 := null;
    var ItsAutoInteropGeonetworking v_eut4 := null;
        
    // 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_mtcCf01Up(v_eut1, v_eut2, v_eut3, v_eut4);
        
    // Preamble
        
    // Start components
    v_eut1.start(f_TC_AUTO_IOT_DENM_MFW_BV_03_eut1(v_eut1, PX_EUT1_ID));
    v_eut2.start(f_TC_AUTO_IOT_DENM_MFW_BV_03_eut2(v_eut2, PX_EUT2_ID));
    v_eut3.start(f_TC_AUTO_IOT_DENM_MFW_BV_03_eut3(v_eut3, PX_EUT3_ID));
    v_eut4.start(f_TC_AUTO_IOT_DENM_MFW_BV_03_eut4(v_eut4, PX_EUT4_ID));
        
    // Synchronization
    f_serverSyncNClientsAndStop(4, {c_prDone, c_tbDone});
        
    // Cleanup
    f_mtcCf01Down(v_eut1, v_eut2, v_eut3, v_eut4);
        
  } // End of TC_AUTO_IOT_DENM_MFW_BV_03
    
  group g_TC_AUTO_IOT_DENM_MFW_BV_03 { 
garciay's avatar
garciay committed