LibItsMapemSpatem_Functions.ttcn 17.2 KB
Newer Older
garciay's avatar
garciay committed
 *    @author   ETSI / STF484 / STF517
Yann Garcia's avatar
Yann Garcia committed
 *    @version  $Url: https://oldforge.etsi.org/svn/LibIts/tags/20170222_STF527_Final/ttcn/MapemSpatem/LibItsMapemSpatem_Functions.ttcn $
 *              $Id: LibItsMapemSpatem_Functions.ttcn,v 1.2 2018/05/31 15:57:09 dte Exp $
 *    @desc     Module containing common functions for ITS MAPEM SPATEM
garciay's avatar
garciay committed
 *    @copyright   ETSI Copyright Notification
 *                 No part may be reproduced except as authorized by written permission.
 *                 The copyright and the foregoing restriction extend to reproduction in all media.
 *                 All rights reserved.
 *
 */
module LibItsMapemSpatem_Functions {
    
    // LibCommon
    import from LibCommon_Sync all;
    import from LibCommon_Time all;
    import from LibCommon_VerdictControl all;
    
    // LibIts
    import from ITS_Container language "ASN.1:1997" all;
    import from DSRC language "ASN.1:1997" all;
Yann Garcia's avatar
Yann Garcia committed
    import from IEEE1609dot2BaseTypes language "ASN.1:1997" all;
    
    // LibItsCommon
    import from LibItsCommon_TypesAndValues all;
    import from LibItsCommon_Templates all;
    import from LibItsCommon_Functions all;
garciay's avatar
garciay committed
    import from LibItsCommon_Pixits all;
Yann Garcia's avatar
Yann Garcia committed
    // LibItsSecurity
    import from LibItsSecurity_Functions all;
    
    // LibItsMapemSpatem
    import from LibItsMapemSpatem_TestSystem all;
    import from LibItsMapemSpatem_TypesAndValues all;
    import from LibItsMapemSpatem_Templates all;
    import from LibItsMapemSpatem_Pics all;
    import from LibItsMapemSpatem_Pixits all;

    group utFuntions { 
            
        /**
         * @desc    Requests to bring the IUT in an initial state
         * @param   p_init The initialisation to trigger.
         */
        function f_utInitializeIut(template (value) UtMapemSpatemInitialize p_init) runs on ItsMapemSpatem {
Yann Garcia's avatar
Yann Garcia committed
            //deactivate mapemSpatemPort default alts
            vc_mapemSpatemDefaultActive := false;
            
              [] utPort.receive(UtMapemSpatemResults: { utMapemSpatemInitializeResult := true }) {
                    tc_wait.stop;
                    log("*** " & testcasename() & ": INFO: IUT initialized ***");
                }
                [] tc_wait.timeout {
                    log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }            
Yann Garcia's avatar
Yann Garcia committed
            
            //deactivate mapemSpatemPort default alts
            vc_mapemSpatemDefaultActive := true;
        }
        
        /**
         * @desc    Triggers an event from the application layer
         * @param   p_event The event to trigger.
         */
        function f_utTriggerEvent(
                                  in template (value) UtMapemSpatemTrigger p_event
        ) runs on ItsMapemSpatem {
            
Yann Garcia's avatar
Yann Garcia committed
            //deactivate mapemSpatemPort default alts
            vc_mapemSpatemDefaultActive := false;
            
            utPort.send ( p_event );
            tc_wait.start;
            alt {
              [] utPort.receive ( UtMapemSpatemResults: { utMapemSpatemTriggerResult := true }) {
                }
              [] utPort.receive ( UtMapemSpatemResults: { utMapemSpatemTriggerResult := false }) {
                    tc_wait.stop;
                    f_selfOrClientSyncAndVerdict("MapSpat Trigger failed", e_error);
                }
                [] tc_wait.timeout {
                    log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }
            
Yann Garcia's avatar
Yann Garcia committed
            //deactivate mapemSpatemPort default alts
            vc_mapemSpatemDefaultActive := true;
            
    group adapterControl {
        
        /**
         * @desc Initialise secure mode if required
         */
        function f_initialiseSecuredMode(
Yann Garcia's avatar
Yann Garcia committed
                                         in charstring p_certificateId := PX_CERT_FOR_TS 
        ) runs on ItsMapemSpatem {
            
            if (PICS_IS_IUT_SECURED == true) {
                
Yann Garcia's avatar
Yann Garcia committed
                if(e_success != f_acTriggerSecEvent(m_acEnableSecurity(p_certificateId))) { 
                    log("*** INFO: TEST CASE NOW STOPPING ITSELF! ***");
                    stop;
                }
            }
            
        } // End of function f_initialiseSecuredMode()
        
        function f_uninitialiseSecuredMode() runs on ItsMapemSpatem {
            
            if (PICS_IS_IUT_SECURED == true) {
                f_acTriggerSecEvent(m_acDisableSecurity);
            }
            
        } // End of function f_initialiseSecuredMode()
        
        /**
         * @desc    Triggers event in the test system adaptation.
         * @param   p_event The event to trigger
         * @return  FncRetCode
         */
        function f_acTriggerSecEvent(template (value) AcSecPrimitive p_event) runs on ItsMapemSpatem return FncRetCode {
            var FncRetCode v_ret := e_success;
            
            acPort.send(p_event);
            tc_ac.start;
            alt {
                [] acPort.receive(m_acSecResponseSuccess) {
                    tc_ac.stop;
                }
                [] acPort.receive {
                    tc_ac.stop;
                    log("*** " & __SCOPE__ & ": ERROR: Received unexpected message ***");
                    f_selfOrClientSyncAndVerdict("error", e_error);
                }
                [] tc_ac.timeout {
                    log("*** " & __SCOPE__ & ": ERROR: Timeout while waiting for adapter control event result ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }
            
            return v_ret;
        }
        
    } // End of group adapterControl 
    
    group altsteps {
        
        /**
         * @desc Default handling cf01 de-initialisation.
         */
        altstep a_cf01Down() runs on ItsMapemSpatem {
            [] a_shutdown() {
                f_poDefault();
                f_cfDown();
                log("*** a_cf01Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;
            }
        }
        
        /**
         * @desc Default handling cf02 de-initialisation.
         */
            altstep a_cf02Down() runs on ItsMtc {
          [] a_shutdown() {
            f_cf02Down();
            log("*** a_cf02Down: INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
            stop;
          }
        }
        
        /**
         * @desc The base default.
         */
        altstep a_default() runs on ItsMapemSpatem {
Yann Garcia's avatar
Yann Garcia committed
            [vc_mapemSpatemDefaultActive] mapemSpatemPort.receive(mw_mapemInd(mw_mapemPdu(mw_defaultMapem))) { 
garciay's avatar
garciay committed
                log("*** " & testcasename() & ": INFO: MAPEM received in default ***");
Yann Garcia's avatar
Yann Garcia committed
            [vc_mapemSpatemDefaultActive] mapemSpatemPort.receive(mw_spatemInd(mw_spatemPdu(mw_defaultSpatem))) { 
garciay's avatar
garciay committed
                log("*** " & testcasename() & ": INFO: MAPEM received in default ***");
Yann Garcia's avatar
Yann Garcia committed
            [vc_mapemSpatemDefaultActive] mapemSpatemPort.receive {
                log("*** " & testcasename() & ": ERROR: Received an unexpected message ***");
                f_selfOrClientSyncAndVerdict("error", e_error);
            }
            [] any timer.timeout {
                log("*** " & testcasename() & ": INCONC: Timeout while awaiting the reception of a message ***");
                f_selfOrClientSyncAndVerdict("error", e_timeout);
            }
            [] a_shutdown() {
                f_poDefault();
                f_cfDown();
                log("*** " & testcasename() & ": INFO: TEST COMPONENT NOW STOPPING ITSELF! ***");
                stop;   
            }
        }
        
        /**
         * @desc The default for handling upper tester messages.
         */
        altstep a_utDefault() runs on ItsMapemSpatem {
            var UtMapemEventInd v_mapemevent;
            var UtSpatemEventInd v_spatemevent;
            [] utPort.receive(UtMapemEventInd:?) -> value v_mapemevent {
                //store every upper tester indication received
Yann Garcia's avatar
Yann Garcia committed
                log("*** " & testcasename() & ": INFO: Store UtMapemEventInd messge ***");
                vc_utMapemEvents[lengthof(vc_utMapemEvents)] := v_mapemevent;
            [] utPort.receive(UtSpatemEventInd:?) -> value v_spatemevent {
                //store every upper tester indication received
Yann Garcia's avatar
Yann Garcia committed
                log("*** " & testcasename() & ": INFO: Store UtSpatemEventInd messge ***");
                vc_utSpatemEvents[lengthof(vc_utSpatemEvents)] := v_spatemevent;
                repeat;
            }
            [] utPort.receive {
                log("*** " & testcasename() & ": INFO: Received unhandled/unknown UT message from IUT ***");
                repeat;
            }
        }
        
    } // End of group altsteps

    group mapSpatConfigurationFunctions {
        
        /**
         * @desc    Setups default configuration   
Yann Garcia's avatar
Yann Garcia committed
         * @param   p_certificateId The certificate identifier the TA shall use in case of secured IUT
Yann Garcia's avatar
Yann Garcia committed
                        in charstring p_certificateId := PX_CERT_FOR_TS
        )  runs on ItsMapemSpatem system ItsMapemSpatemSystem {
            map(self:utPort, system:utPort);
            map(self:mapemSpatemPort, system:mapemSpatemPort);
            
            // Connect
            f_connect4SelfOrClientSync();
            activate(a_cf01Down());
            
Yann Garcia's avatar
Yann Garcia committed
            f_initialiseSecuredMode(p_certificateId); 
        } // End of f_cfUp
        
        /**
         * @desc    Deletes default configuration 
         */
        function f_cfDown() runs on ItsMapemSpatem /* TITAN TODO: system ItsMapemSpatemSystem */ {
            // Initialise secured mode
            f_uninitialiseSecuredMode();
            
            unmap(self:acPort, system:acPort);
            unmap(self:mapemSpatemPort, system:mapemSpatemPort);
            
            f_disconnect4SelfOrClientSync();
        } // End of f_cfDown
        
        /**
         * @desc    Setups default configuration   
         * @param   p_certificateId The certificate identifier the TA shall use in case of secured IUT
         */
        function f_cf02Up(in charstring p_certificateId := PX_CERT_FOR_TS
        )  runs on ItsMtc mtc ItsMtc system ItsMapemSpatemSystem {
            
            // Variables
            var integer i;
            
            // Select components
            vc_componentTable := {{c_compMap, omit}, {c_compSpat, omit}};
            
            // Create components
            for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
              vc_componentTable[i].msComponent := ItsMapemSpatem.create(vc_componentTable[i].componentName) alive;
            }
            
            // Map & Connect
            map(self:acPort, system:acPort);
            map(self:utPort, system:utPort);
            connect(self:syncPort, mtc:syncPort);
            for(i:=0; i < lengthof(vc_componentTable); i:=i+1) {
              map(vc_componentTable[i].msComponent:acPort, system:acPort);
              map(vc_componentTable[i].msComponent:utPort, system:utPort);
              map(vc_componentTable[i].msComponent:mapemSpatemPort, system:mapemSpatemPort);
              connect(vc_componentTable[i].msComponent:syncPort, self:syncPort);
            }
            
            activate(a_cf02Down());
            
            // Initialise secured mode
            f_initialiseSecuredMode(p_certificateId); 
            
        } // End of f_cf02Up
        
        /**
         * @desc    Deletes default configuration 
         */
        function f_cf02Down() runs on ItsMtc mtc ItsMtc system ItsMapemSpatemSystem {
            
            // Local variables
            var integer i;
            
            f_uninitialiseSecuredMode();
            
            // Unmap & Disconnect
            for(i:=0; i < lengthof(vc_componentTable); i:=i+1) { 
              unmap(vc_componentTable[i].msComponent:utPort, system:utPort);
              unmap(vc_componentTable[i].msComponent:acPort, system:acPort);
              unmap(vc_componentTable[i].msComponent:mapemSpatemPort, system:mapemSpatemPort);
              disconnect(vc_componentTable[i].msComponent:syncPort, self:syncPort);
            }
            unmap(self:acPort, system:acPort);
            unmap(self:utPort, system:utPort);
            disconnect(self:syncPort, mtc:syncPort);
            
            
        } // End of f_cf02Down
        
    } // End of of mapSpatConfigurationFunctions
    
    group preambles {
        
        /**
         * @desc The default preamble.
         */
        function f_prDefault() runs on ItsMapemSpatem {
            vc_default := activate(a_default());
            activate(a_utDefault());
        }
        
        /**
         * @desc Brings the IUT into an initial state.
         * @return FncRetCode 
         */
Yann Garcia's avatar
Yann Garcia committed
        function f_prInitialState(
                                  in charstring p_certificate_id := ""
                                  ) runs on ItsMapemSpatem return FncRetCode {
Yann Garcia's avatar
Yann Garcia committed
            // Initialize IUT with given certificate
            if (p_certificate_id != "") { // Initialize IUT with given certificate
                var HashedId8 v_hashedId8 := '0000000000000000'O;
                
                fx_readCertificateDigest("CERT_SRM_SSP_NONE", v_hashedId8);
                if ('0000000000000000'O ==  v_hashedId8) {
                    // Certificate not found
                    log("*** " & testcasename() & ": Required IUT certificate is not found on the test system ***");
                    return e_timeout;
                }
                f_utInitializeIut(m_mapemSpatemInitialize(v_hashedId8));
            } else {
                f_utInitializeIut(m_mapemSpatemInitialize);
            }
            f_prDefault();
            return v_ret;
        }
        
    } // End of group preambles

    group postambles {
        
        /**
         * @desc The default postamble.
         */
        function f_poDefault() runs on ItsMapemSpatem {
            //empty
        }
        
    } // End of group postambles
        
    group receiveFunctions {
        
        /**
         * @desc Awaits a SPATE message and returns it
         * @param p_rcvMsg The expected message to be received.
         * @param p_rcvdMsg The received message - OUT.
         */
        function f_awaitSpateMessage(in template (present) SpatemInd p_rcvMsg, out SpatemInd p_rcvdMsg) runs on ItsMapemSpatem {
            
            tc_ac.start;
            alt {
                [] mapemSpatemPort.receive(p_rcvMsg) -> value p_rcvdMsg {
                    tc_ac.stop;
                }
                [] tc_ac.timeout {
                    log("*** " & testcasename() & ": INFO: Timeout while awaiting the reception of a message ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }
        }
        
        /**
         * @desc Awaits a MAPE message and returns it
         * @param p_rcvMsg The expected message to be received.
         * @param p_rcvdMsg The received message - OUT.
         */
        function f_awaitMapeMessage(in template (present) MapemInd p_rcvMsg, out MapemInd p_rcvdMsg) runs on ItsMapemSpatem {
            
            tc_ac.start;
            alt {
                [] mapemSpatemPort.receive(p_rcvMsg) -> value p_rcvdMsg {
                    tc_ac.stop;
                }
                [] tc_ac.timeout {
                    log("*** " & testcasename() & ": INFO: Timeout while awaiting the reception of a message ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }
        }
        
    } // End of group receiveFunctions
    group componentFunctions {
      /**
       * @desc    Get the component  corresponding to a key
       * @param   p_componentName   Name searched component
       * @return  ItsGeoNetworking - The searched position vector
       */
      function f_getComponent(
                              in charstring p_componentName
                              ) runs on ItsMtc
      return ItsMapemSpatem {
            
        var ItsMapemSpatem v_return := null;
        var integer i := 0;
            
        for (i:=0; i<lengthof(vc_componentTable); i:=i+1) {
          if (vc_componentTable[i].componentName == p_componentName) {
            if (isvalue(vc_componentTable[i].msComponent)) {
            v_return := valueof(vc_componentTable[i].msComponent);
            }
            else {
              testcase.stop(__SCOPE__ & " can not handle omitted MS components");
            }
          }
        }
            
        return v_return;
      }
    }
    
} // End of module LibItsMapemSpatem_Functions