ItsAutoInterop_Functions.ttcn 31 KB
Newer Older
module ItsAutoInterop_Functions { 
    
    // LibCommon
    import from LibCommon_BasicTypesAndValues all;
    import from LibCommon_DataStrings all;
    import from LibCommon_VerdictControl all;
    import from LibCommon_Sync all;
    
    // LibItsCommon
    import from LibItsCommon_TypesAndValues all;
    import from LibItsCommon_Templates all;
    import from LibItsCommon_Functions all;
    import from LibItsCommon_Pixits all;
    import from LibItsCommon_TestSystem all;
    
    // LibItsGeoNetworking
    import from LibItsGeoNetworking_TypesAndValues all;
    import from LibItsGeoNetworking_Templates all;
    import from LibItsGeoNetworking_Pics all;
    
    // LibItsSecurity
    import from LibItsSecurity_TypesAndValues all;
    import from LibItsSecurity_Templates all;
    import from LibItsSecurity_Functions all;
    import from LibItsSecurity_Pixits all;
    import from ItsAutoInterop_TypesAndValues all;
    import from ItsAutoInterop_Templates all;
    import from ItsAutoInterop_TestSystem all;
    
    group utFunctions {
        
        /**
         * @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 ItsAutoInteropGeonetworking {
            
            //deactivate autoInteropPort default alts
            vc_autoInteropDefaultActive := false;
            
            utPort.send(p_init);
            tc_wait.start;
            alt {
//FIXME RGY As discussed, port in type is changed to a top-level union type
//                [] utPort.receive(UtInitializeResult:true) {
                [] utPort.receive(UtCommonResults:{utInitializeResult:=true}) {
                    tc_wait.stop;
                    log("*** f_utInitializeIut: INFO: IUT initialized ***");
                }
                [] utPort.receive {
                    tc_wait.stop;
                    log("*** f_utInitializeIut: INFO: IUT could not be initialized ***");
                    f_selfOrClientSyncAndVerdict("error", e_error);
                }
                [] tc_wait.timeout {
                    log("*** f_utInitializeIut: INFO: IUT could not be initialized in time ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }
            
            //activate autoInteropPort default alts
            vc_autoInteropDefaultActive := true;
            
        }
        
        /**
         * @desc    Triggers event from the application layer
         * @param   p_event The event to trigger.
         */
        function f_utTriggerEvent(template (value) UtAutoInteropTrigger p_event) runs on ItsAutoInteropGeonetworking {
           
            //deactivate autoInteropPort default alts
            vc_autoInteropDefaultActive := false;
            
            utPort.send(p_event);
            tc_wait.start;
            alt {
    //FIXME RGY As discussed, port in type is changed to a top-level union type 
    //                [] utPort.receive(UtAutoInteropTriggerResult:true) {
                [] utPort.receive(UpperTesterAutoInteropResults:{utInitializeResult:=true}) {
                    tc_wait.stop;
                }
                [] utPort.receive {
                    tc_wait.stop;
                }
                [] tc_wait.timeout {
                }
            }
            
            //activate autoInteropPort default alts
            vc_autoInteropDefaultActive := true;
            
        }
    } // End of group utFunctions
    group hmiFunctions {
        
        /**
         * @desc    Requests to bring the HMI in an initial state
         * @param   p_init The initialisation to trigger.
         */
        function f_hmiInitializeIut(template (value) HmiInitialize p_init) runs on ItsAutoInteropGeonetworking {
            
            //deactivate autoInteropPort default alts
            vc_autoInteropDefaultActive := false;
            
            hmiPort.send(p_init);
            tc_wait.start;
            alt {
//FIXME RGY As discussed, port in type is changed to a top-level union type
//                [] hmiPort.receive(HmiInitializeResult:true) {
                [] hmiPort.receive(HmiAutoInteropResults:{hmiInitializeResult:=true}) {
                    tc_wait.stop;
                    log("*** f_hmiInitializeIhmi: INFO: EUT's HMI initialized ***");
                }
                [] hmiPort.receive {
                    tc_wait.stop;
                    log("*** f_hmiInitializeIhmi: INFO: EUT's HMI could not be initialized ***");
                    f_selfOrClientSyncAndVerdict("error", e_error);
                }
                [] tc_wait.timeout {
                    log("*** f_hmiInitializeIhmi: INFO: EUT's HMI could not be initialized in time ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }
            
            //activate autoInteropPort default alts
            vc_autoInteropDefaultActive := true;
            
        }
        
    } // End of group hmiFunctions
    group preambles {
        
        /**
         * @desc Set up an EUT component
         * @param p_eut      The component reference
         * @param p_scenario The GNSS scenario. Default: e_staticPosition
         */
        function f_cfPtcUp(
                           in ItsAutoInteropGeonetworking p_eut, 
                           in Scenario p_scenario := e_staticPosition // TODO Not used
        ) runs on ItsAutoInteropGeonetworking /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
            
            // EUT
            //map(p_eut:acPort, system:acPort); Not used
            //map(p_eut:utPort, system:utPort); Not used 
            map(p_eut:hmiPort, system:hmiPort); 
            map(p_eut:geoNetworkingPort, system:geoNetworkingPort);
            connect(p_eut:syncPort, self:syncPort);
            
            //activate(a_cfPtcDown()); // FIXME To be done
            
            //Initialze the IUT
            f_initialiseSecuredMode();
            
            // MTC intializes IUT
            f_initialState(p_scenario);
            
        } // End of function f_cfPtcUp
        
        /**
         * @desc Set up MTC for configuration #1
         * @param p_eut1      The component reference for EUT1
         * @param p_eut2      The component reference for EUT2
         * @param p_eut3      The component reference for EUT3
         * @param p_eut4      The component reference for EUT4
         * @see Draft ETSI TS yyy xxx-2 V0.0.8 (2017-02) Clause 5.3.1 CF-01: Verify complete forwarding message scenario 
         */
        function f_mtcCf01Up(
                             inout ItsAutoInteropGeonetworking p_eut1, 
                             inout ItsAutoInteropGeonetworking p_eut2,
                             inout ItsAutoInteropGeonetworking p_eut3,
                             inout ItsAutoInteropGeonetworking p_eut4
        ) runs on ItsAutoInteropGeoNetworkingMtc /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
          
            // Create components
            p_eut1 := ItsAutoInteropGeonetworking.create(c_compNodeB); 
            p_eut2 := ItsAutoInteropGeonetworking.create(c_compNodeC);
            p_eut3 := ItsAutoInteropGeonetworking.create(c_compNodeD);
            p_eut4 := ItsAutoInteropGeonetworking.create(c_compNodeE);
            
            // Map & Connect
            map(self:acPort, system:acPort);
            map(self:utPort, system:utPort);
            connect(self:syncPort, mtc:syncPort);
            
            // EUT1/EUT2/EUT3/EUT4
            disconnect(p_eut1:eutGeoNetworkingPort, p_eut2:eutGeoNetworkingPort); // EUT1 & EUT2 are on-link
            disconnect(p_eut1:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort); // EUT1 & EUT3 are on-link
            disconnect(p_eut2:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort); // EUT2 & EUT3 are on-link
            disconnect(p_eut2:eutGeoNetworkingPort, p_eut4:eutGeoNetworkingPort); // EUT2 & EUT4 are on-link
            disconnect(p_eut3:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort); // EUT3 & EUT4 are on-link
                                                                                  // EUT1 & EUT4 are of-link
            
            activate(a_mtcCf01Down(p_eut1, p_eut2, p_eut3, p_eut4));
            
        } // End of function f_mtcCf01Up
        
        /**
         * @desc Set up MTC for configuration #2
         * @param p_eut1      The component reference for EUT1
         * @param p_eut2      The component reference for EUT2
         * @see Draft ETSI TS yyy xxx-2 V0.0.8 (2017-02) Clause 5.3.2 CF-02: Road Works Warning configuration 
         */
        function f_mtcCf02Up(
                             inout ItsAutoInteropGeonetworking p_eut1, 
                             inout ItsAutoInteropGeonetworking p_eut2
        ) runs on ItsAutoInteropGeoNetworkingMtc /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
            
            // Create components
            p_eut1 := ItsAutoInteropGeonetworking.create(c_compNodeB); 
            p_eut2 := ItsAutoInteropGeonetworking.create(c_compNodeC);
            
            // Map & Connect
            map(self:acPort, system:acPort);
            map(self:utPort, system:utPort);
            connect(self:syncPort, mtc:syncPort);
            
            // EUT1/EUT2
            connect(p_eut1:eutGeoNetworkingPort, p_eut2:eutGeoNetworkingPort); 
            
            activate(a_mtcCf02Down(p_eut1, p_eut2));
            
        } // End of function f_mtcCf02Up
        
        /**
         * @desc Set up MTC for configuration #3
         * @param p_eut1      The component reference for EUT1
         * @param p_eut2      The component reference for EUT2
         * @param p_eut3      The component reference for EUT3
         * @see Draft ETSI TS yyy xxx-2 V0.0.8 (2017-02) Clause 5.3.3 CF-03: CA messages 
         */
        function f_mtcCf03Up(
                             inout ItsAutoInteropGeonetworking p_eut1,
                             inout ItsAutoInteropGeonetworking p_eut2,
                             inout ItsAutoInteropGeonetworking p_eut3
        ) runs on ItsAutoInteropGeoNetworkingMtc /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
          
            // Create components
            p_eut1 := ItsAutoInteropGeonetworking.create(c_compNodeB); 
            p_eut2 := ItsAutoInteropGeonetworking.create(c_compNodeC);
            p_eut3 := ItsAutoInteropGeonetworking.create(c_compNodeD);
            
            // Map & Connect
            map(self:acPort, system:acPort);
            map(self:utPort, system:utPort);
            connect(self:syncPort, mtc:syncPort);
            
            // EUT1/EUT2/EUT3
            connect(p_eut1:eutGeoNetworkingPort, p_eut2:eutGeoNetworkingPort);
            connect(p_eut1:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort);
            connect(p_eut2:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort);
            
            activate(a_mtcCf03Down(p_eut1, p_eut2, p_eut3));
            
        } // End of function f_mtcCf03Up
        
        
        /**
         * @desc The default preamble.
         */
        function f_prDefault() runs on ItsAutoInteropGeonetworking {
            activate(a_default());
            activate(a_utDefault());
            activate(a_hmiDefault());
        }
        
    } // End of group preambles
    group postambles {
        
        /**
         * @desc Shutdown an EUT component
         * @param p_eut The component reference
         */
        function f_cfPtcDown(
                            inout ItsAutoInteropGeonetworking p_eut
        ) runs on ItsAutoInteropGeonetworking /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
            
            // Wait components done
            p_eut.done;
            
            deactivate;
            
            // EUT
            unmap(p_eut:acPort, system:acPort); 
            unmap(p_eut:utPort, system:utPort); 
            unmap(p_eut:hmiPort, system:hmiPort); 
            unmap(p_eut:geoNetworkingPort, system:geoNetworkingPort);
            disconnect(p_eut:syncPort, self:syncPort);
            
        } // End of function f_cfPtcDown
        
        /**
         * @desc Shutdown MTC for configuration #1
         * @param p_eut1      The component reference for EUT1
         * @param p_eut2      The component reference for EUT2
         * @param p_eut3      The component reference for EUT3
         * @param p_eut4      The component reference for EUT4
         * @see Draft ETSI TS yyy xxx-2 V0.0.8 (2017-02) Clause 5.3.1 CF-01: Verify complete forwarding message scenario 
         */
        function f_mtcCf01Down(
                               inout ItsAutoInteropGeonetworking p_eut1,
                               inout ItsAutoInteropGeonetworking p_eut2,
                               inout ItsAutoInteropGeonetworking p_eut3,
                               inout ItsAutoInteropGeonetworking p_eut4
        ) runs on ItsAutoInteropGeoNetworkingMtc /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
            
            // Wait components done
            p_eut1.done; 
            p_eut2.done;
            p_eut3.done;
            p_eut4.done;
            
            deactivate;
            
            // Unmap & disconnect
            unmap(self:acPort, system:acPort);
            unmap(self:utPort, system:utPort);
            disconnect(self:syncPort, mtc:syncPort);
            
            // EUT1/EUT2/EUT3/EUT4
            disconnect(p_eut1:eutGeoNetworkingPort, p_eut2:eutGeoNetworkingPort); 
            disconnect(p_eut1:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort); 
            disconnect(p_eut2:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort); 
            disconnect(p_eut2:eutGeoNetworkingPort, p_eut4:eutGeoNetworkingPort); 
            disconnect(p_eut3:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort); 
            
        } // End of function f_mtcCf01Down
        
        /**
         * @desc Shutdown MTC for configuration #2
         * @param p_eut1      The component reference for EUT1
         * @param p_eut2      The component reference for EUT2
         * @see Draft ETSI TS yyy xxx-2 V0.0.8 (2017-02) Clause 5.3.2 CF-02: Road Works Warning configuration 
         */
        function f_mtcCf02Down(
                               inout ItsAutoInteropGeonetworking p_eut1,
                               inout ItsAutoInteropGeonetworking p_eut2
        ) runs on ItsAutoInteropGeoNetworkingMtc /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
            
            // Wait components done
            p_eut1.done; 
            p_eut2.done;
            
            deactivate;
            
            // Unmap & disconnect
            unmap(self:acPort, system:acPort);
            unmap(self:utPort, system:utPort);
            disconnect(self:syncPort, mtc:syncPort);
            
        } // End of function f_mtcCf02Down
        
        /**
         * @desc Shutdown MTC with three components
         * @param p_eut1      The component reference for EUT1
         * @param p_eut2      The component reference for EUT2
         * @param p_eut3      The component reference for EUT3
         */
        function f_mtcCf03Down(
                            inout ItsAutoInteropGeonetworking p_eut1,
                            inout ItsAutoInteropGeonetworking p_eut2,
                            inout ItsAutoInteropGeonetworking p_eut3
        ) runs on ItsAutoInteropGeoNetworkingMtc /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
            
            // Wait components done
            p_eut1.done; 
            p_eut2.done;
            p_eut3.done;
            
            deactivate;
            
            // Unmap & disconnect
            unmap(self:acPort, system:acPort);
            unmap(self:utPort, system:utPort);
            disconnect(self:syncPort, mtc:syncPort);
            
            // EUT1/EUT2/EUT3
            disconnect(p_eut1:eutGeoNetworkingPort, p_eut2:eutGeoNetworkingPort); 
            disconnect(p_eut1:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort); 
            disconnect(p_eut3:eutGeoNetworkingPort, p_eut3:eutGeoNetworkingPort); 
            
        } // End of function f_mtcCf03Down
        
        /**
         * @desc The default postamble.
         */
        function f_poDefault() runs on ItsAutoInteropGeonetworking {
          deactivate;
//            deactivate(a_default());
//            deactivate(a_utDefault());
//            deactivate(a_hmiDefault());
            // TODO f_acStopScenario();
        }
        
    } // End of group postambles
    group autoInteropPosition {
        
        /**
         * @desc    Compute distance between two points
         * @param   p_pointA    First point
         * @param   p_pointB    Second point
         * @return  Computed distance in meters
         * @see     fx_computeDistance
         */
        function f_distance(
                            in LongPosVector p_pointA,
                            in LongPosVector p_pointB
        ) return float {
         
//            log("*** f_distance: INFO: calling fx_computeDistance() ***");
            return fx_computeDistance(p_pointA.latitude, p_pointA.longitude, p_pointB.latitude, p_pointB.longitude);
        }
        
    } // End of group autoInteropPosition
    group autoInteropConfiguration {
      
        /**
         * @desc Brings the IUT into an initial state.
         * @remark Component variable vc_hashedId8ToBeUsed shall be set with the IUT certificate to be used
         */
        function f_initialState(Scenario p_scenario := e_staticPosition) runs on ItsAutoInteropGeonetworking {
            
            if (PICS_GN_SECURITY) {
                var Oct8 v_hashedId8ToBeUsed := f_setupIutCertificate(vc_hashedId8ToBeUsed);
                if (oct2int(v_hashedId8ToBeUsed) == 0) {
                    v_hashedId8ToBeUsed := 'FFFFFFFFFFFFFFFF'O; // Reset to unknown value, the IUT will use its own certificates
                }
                f_utInitializeIut(m_secGnInitialize(v_hashedId8ToBeUsed));
                // TODO f_hmiInitializeIut(m_secGnInitialize(v_hashedId8ToBeUsed));
            } // else, default behavior
            else {
                f_utInitializeIut(m_gnInitialize);
                f_hmiInitializeIut(m_hmiInitialize);
            }
            
            // TODO f_acLoadScenario(p_scenario);
            // TODO f_acStartScenario();
        }
        
        /**
         * @desc Initialise secure mode if required
         */
        function f_initialiseSecuredMode() runs on ItsAutoInteropGeonetworking {
            if ((PICS_GN_SECURITY == true) or (PICS_IS_IUT_SECURED == true)) {
                if(e_success != f_acEnableSecurity()){
                    log("*** INFO: TEST CASE NOW STOPPING ITSELF! ***");
                    stop;
                }
            }
        } // End of function f_initialiseSecuredMode()
        
        function f_uninitialiseSecuredMode() runs on ItsAutoInteropGeonetworking {
            if ((PICS_GN_SECURITY == true) or (PICS_IS_IUT_SECURED == true)) {
                f_acDisableSecurity();
            }
        } // End of function f_initialiseSecuredMode()
        
        /**
         * @desc    Triggers test adapter to enable security support
         * @return  FncRetCode
         */
        function f_acEnableSecurity() runs on ItsAutoInteropGeonetworking return FncRetCode {
            
            // Local variables
            
            // Load certificates
            if (PICS_GN_SECURITY) {
                if( not f_loadCertificates(PX_IUT_SEC_CONFIG_NAME) ) {
                    return e_error;
                }
                
                // FIXME Useless???
//                // Initialize vc_location
//                f_setGenerationLocation(
//                    f_getTsLatitude(),
//                    f_getTsLongitude()
//                );
                return f_acTriggerSecEvent(m_acEnableSecurity(cc_taCert_A));
            }
            return f_acTriggerSecEvent(m_acEnableSecurity(PX_CERT_FOR_TS));
        }
        
        /**
         * @desc    Triggers test adapter to disable security support
         * @return  FncRetCode
         */
        function f_acDisableSecurity() runs on ItsAutoInteropGeonetworking return FncRetCode {
            
            f_unloadCertificates();
            
            return f_acTriggerSecEvent(m_acDisableSecurity);
            
        }
        
        /**
         * @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 ItsAutoInteropGeonetworking 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 autoInteropConfiguration
    group adapterControl {
        
        /**
         * @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 ItsAutoInteropGeonetworking 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("*** f_acTriggerEvent: ERROR: Received unexpected message ***");
                    f_selfOrClientSyncAndVerdict("error", e_error);
                }
                [] tc_ac.timeout {
                    log("*** f_acTriggerEvent: 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 ItsAutoInteropGeonetworking {
            
            if (PX_GNSS_SCENARIO_SUPPORT==true) {
                f_acTriggerGnssEvent(m_loadScenario(p_scenario));
            }
        } // end f_acLoadScenario
        
        /**
         * @desc    Starts a loaded scenario
         */
        function f_acStartScenario() runs on ItsAutoInteropGeonetworking {
            
            if (PX_GNSS_SCENARIO_SUPPORT==true) {
                f_acTriggerGnssEvent(m_startScenario);
                vc_scenarioStarted := true;
            }
        } // end f_acStartScenario
        
        /**
         * @desc    Stops a loaded scenario
         */
        function f_acStopScenario() runs on ItsAutoInteropGeonetworking {
            
            if (PX_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
                f_acTriggerGnssEvent(m_stopScenario);
                vc_scenarioStarted := false;
            }
        } // end f_acStopScenario
        
    } // End of group adapterControl
    group autoInteropAltsteps {
        
        /**
         * @desc The base default.
         */
        altstep a_default() runs on ItsAutoInteropGeonetworking {
            
            [vc_autoInteropDefaultActive] geoNetworkingPort.receive( // Filtering LSRequest
                mw_geoNwInd(
                    mw_geoNwPdu(
                        mw_geoNwLsRequestPacket(
                            ?,
                            ?
            )))) {
                // Nothing to do
                repeat;
            }
            [vc_autoInteropDefaultActive] geoNetworkingPort.receive( // Filtering LSReply
                mw_geoNwInd(
                    mw_geoNwPdu(
                        mw_geoNwLsReplyPacket(
                            ?,
                            ?
            )))) {
                // Nothing to do
                repeat;
            }
            [vc_autoInteropDefaultActive] geoNetworkingPort.receive( // Filtering Secured CA messages
                mw_geoNwInd(
                    mw_geoNwSecPdu(
                        mdw_securedMessage_CAMs,
                        ?
            ))) {
                // Skip CAM messages
                log("*** a_default: WARNING: Skip secured CAM messages ***");
                repeat;
            }
            [vc_autoInteropDefaultActive] geoNetworkingPort.receive( // Filtering Secured DEN messages
                mw_geoNwInd(
                    mw_geoNwSecPdu(
                        mdw_securedMessage_DENMs,
                        ?
            ))) {
                // Skip DENM messages
                log("*** a_default: WARNING: Skip secured DENM messages ***");
                repeat;
            }
            [vc_autoInteropDefaultActive] geoNetworkingPort.receive { // Unexpected GeoNetworking message ==> require refine filtering above
                log("*** a_default: ERROR: Received an unexpected message ***");
                f_selfOrClientSyncAndVerdict("error", e_timeout);
            }
            [vc_autoInteropDefaultActive] eutGeoNetworkingPort.receive { // Unexpected EutGeoNetworking message ==> require refine filtering above
                log("*** a_default: ERROR: Received an unexpected message ***");
                f_selfOrClientSyncAndVerdict("error", e_timeout);
            }
            [] tc_wait.timeout {
                log("*** a_default: ERROR: Timeout while awaiting reaction of the IUT prior to Upper Tester action ***");
                f_selfOrClientSyncAndVerdict("error", e_timeout);
            }
            [] tc_ac.timeout {
                log("*** a_default: ERROR: Timeout while awaiting the reception of a message ***");
                f_selfOrClientSyncAndVerdict("error", e_timeout);
            }
            [] a_shutdown() {
                log("*** a_default: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
        
        /**
         * @desc The default for handling upper tester messages.
         */
        altstep a_utDefault() runs on ItsAutoInteropGeonetworking {
            var UtGnEventInd v_ind;
            [vc_utDefaultActive] utPort.receive(UtGnEventInd:?) -> value v_ind {
                //store every upper tester indication received
                vc_utInds[lengthof(vc_utInds)] := v_ind;
                repeat;
            }
            [vc_utDefaultActive] utPort.receive {
                log("*** " & testcasename() & ": INFO: Received unexpected UT message from IUT ***");
                repeat;
            }
        }
        
        /**
         * @desc The default for handling HMI messages.
         */
        altstep a_hmiDefault() runs on ItsAutoInteropGeonetworking {
            var HmiNeighborEventInds v_hmiNeighborEventInds;
            var HmiSignageEventInd v_hmiSignageEventInd;
            [vc_hmiDefaultActive] hmiPort.receive(HmiNeighborEventInds:?) -> value v_hmiNeighborEventInds {
                //store every upper tester indication received
                vc_hmiNeighborEventIndsList[lengthof(vc_hmiNeighborEventIndsList)] := v_hmiNeighborEventInds;
                repeat;
            }
            [vc_hmiDefaultActive] hmiPort.receive {
                log("*** " & testcasename() & ": INFO: Received unexpected UT message from IUT ***");
                repeat;
            }
            [vc_hmiDefaultActive] hmiPort.receive(HmiSignageEventInd:?) -> value v_hmiSignageEventInd {
                //store every upper tester indication received
                vc_hmiSignageEventIndList[lengthof(vc_hmiSignageEventIndList)] := v_hmiSignageEventInd;
                repeat;
            }
            [vc_hmiDefaultActive] hmiPort.receive {
                log("*** " & testcasename() & ": INFO: Received unexpected UT message from IUT ***");
                repeat;
            }
        }
        
        /**
         * @desc Default handling cf01 de-initialisation.
         */
        altstep a_mtcCf01Down(
                              inout ItsAutoInteropGeonetworking p_eut1,
                              inout ItsAutoInteropGeonetworking p_eut2,
                              inout ItsAutoInteropGeonetworking p_eut3,
                              inout ItsAutoInteropGeonetworking p_eut4
        ) runs on ItsAutoInteropGeoNetworkingMtc /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
            [] a_shutdown() {
                f_mtcCf01Down(p_eut1, p_eut2, p_eut3, p_eut4);
                log("*** a_mtcCf01Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
        
        /**
         * @desc Default handling cf02 de-initialisation.
         */
        altstep a_mtcCf02Down(
                              inout ItsAutoInteropGeonetworking p_eut1,
                              inout ItsAutoInteropGeonetworking p_eut2
        ) runs on ItsAutoInteropGeoNetworkingMtc /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
            [] a_shutdown() {
                f_mtcCf02Down(p_eut1, p_eut2);
                log("*** a_mtcCf02Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
        
        /**
         * @desc Default handling cf03 de-initialisation.
         */
        altstep a_mtcCf03Down(
                              inout ItsAutoInteropGeonetworking p_eut1,
                              inout ItsAutoInteropGeonetworking p_eut2,
                              inout ItsAutoInteropGeonetworking p_eut3
        ) runs on ItsAutoInteropGeoNetworkingMtc /* TITAN TODO: mtc ItsAutoInteropGeoNetworkingMtc system ItsAutoInteropGeoNetworkingSystem */ {
            [] a_shutdown() {
                f_mtcCf03Down(p_eut1, p_eut2, p_eut3);
                log("*** a_mtcCf03Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
        
    } // End of group autoInteropAltsteps
    
} // End of module ItsAutoInterop_Functions