LibItsIvim_Functions.ttcn 17.5 KB
Newer Older
 *    @author     ETSI / STF517  / TTF002
Yann Garcia's avatar
Yann Garcia committed
 *    @version    $Url: https://oldforge.etsi.org/svn/LibIts/tags/20170222_STF527_Final/ttcn/IVIM/LibItsIvim_Functions.ttcn $
 *                $Id: LibItsIvim_Functions.ttcn,v 1.2 2018/05/31 15:57:12 dte Exp $
garciay's avatar
garciay committed
 *    @desc       Module containing functions for IVIM
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 LibItsIvim_Functions {
    
    // LibCommon
    import from LibCommon_Sync all;
    import from LibCommon_VerdictControl all;
    import from LibCommon_Time all;
    
    // LibItsCommon
    import from LibItsCommon_Templates all;
    import from LibItsCommon_TypesAndValues all;
    import from LibItsCommon_Functions all;
    import from LibItsCommon_Pixits all;
    
    // LibItsIvim
    import from ITS_Container language "ASN.1:1997" all;
    import from IVIM_PDU_Descriptions language "ASN.1:1997" all;
    import from IVI language "ASN.1:1997" all;
    import from EfcDsrcGeneric language "ASN.1:1997" all;
    import from EfcDsrcApplication language "ASN.1:1997" all;
    import from IEEE1609dot2BaseTypes language "ASN.1:1997" all;
    
    // LibItsSecurity
    import from LibItsSecurity_Functions all;
    
    // LibItsIvim
    import from LibItsIvim_TestSystem all;
    import from LibItsIvim_TypesAndValues all; 
    import from LibItsIvim_Templates all; 
    import from LibItsIvim_Pics all;
    import from LibItsIvim_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) UtIvimInitialize p_init) runs on ItsIvim {
Yann Garcia's avatar
Yann Garcia committed
            //deactivate ivimPort default alts
            vc_ivimDefaultActive := false;
            
              [] utPort.receive(UtIvimResults: { utIvimInitializeResult := true }) {
                    tc_wait.stop;
                    log("*** " & testcasename() & ": INFO: IUT initialized ***");
                }
                [] a_utDefault() {
                  //empty on purpose
                }
                [] tc_wait.timeout {
                    log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }            
Yann Garcia's avatar
Yann Garcia committed
            
            //deactivate ivimPort default alts
            vc_ivimDefaultActive := true;
        }
        
        /**
         * @desc    Triggers an event from the application layer
         * @param   p_event The event to trigger.
         */
        function f_utTriggerEvent(
                                  in template (value) UtIvimTrigger p_event
        ) runs on ItsIvim return IviIdentificationNumber {
            var IviIdentificationNumber v_iviIdentificationNumber;
            var UtIvimResults v_result;
Yann Garcia's avatar
Yann Garcia committed
            //deactivate ivimPort default alts
            vc_ivimDefaultActive := false;
            
            utPort.send(p_event);
            tc_wait.start;
            alt {
              [] utPort.receive(UtIvimResults: { utIvimTriggerResult := ? }) -> value v_result {
                    v_iviIdentificationNumber := v_result.utIvimTriggerResult.iviIdentificationNumber;
                    if ( not v_result.utIvimTriggerResult.result ) {
                        f_selfOrClientSyncAndVerdict("IVIM Trigger failed", e_error);
                    }
                }
                [] a_utDefault() {
                  //empty on purpose
                }
                [] tc_wait.timeout {
                    log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }
            
Yann Garcia's avatar
Yann Garcia committed
            //deactivate ivimPort default alts
            vc_ivimDefaultActive := true;
            
            return v_iviIdentificationNumber;
        }
        
        /**
         * @desc    Updates an event at the application layer
         * @param   p_event The event to update.
         */
        function f_utUpdateEvent(
                                 in template (value) UtIvimUpdate p_event
        ) runs on ItsIvim return IviIdentificationNumber {
            var IviIdentificationNumber v_iviIdentificationNumber;
            var UtIvimResults v_result;
Yann Garcia's avatar
Yann Garcia committed
            //deactivate ivimPort default alts
            vc_ivimDefaultActive := false;
            
              [] utPort.receive(UtIvimResults: { utIvimUpdateResult := ? }) -> value v_result {
                    v_iviIdentificationNumber := v_result.utIvimUpdateResult.iviIdentificationNumber;
                    if ( not v_result.utIvimUpdateResult.result ) {
                        f_selfOrClientSyncAndVerdict("IVIM Update failed", e_error);
                    }
                }
                [] a_utDefault() {
                  //empty on purpose
                }
                [] tc_wait.timeout {
                    log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
            }
            
Yann Garcia's avatar
Yann Garcia committed
            //activate ivimPort default alts
            vc_ivimDefaultActive := true;
            
            return v_iviIdentificationNumber;
        }
        
        /**
         * @desc    Terminates an event at the application layer
         * @param   p_event The event to terminate.
         */
        function f_utTerminateEvent(template (value) UtIvimTermination p_event) runs on ItsIvim {
            
Yann Garcia's avatar
Yann Garcia committed
            //deactivate ivimPort default alts
            vc_ivimDefaultActive := false;
            
              [] utPort.receive(UtIvimResults: { utIvimTerminationResult := ? }) {
                    tc_wait.stop;
                }
                [] tc_wait.timeout {
                    log("*** " & testcasename() & ": INFO: Could not receive expected UT message from IUT in time ***");
                    f_selfOrClientSyncAndVerdict("error", e_timeout);
                }
                [] a_utDefault() {
                  //empty on purpose
                }
            }
Yann Garcia's avatar
Yann Garcia committed
            
            //deactivate ivimPort default alts
            vc_ivimDefaultActive := true;
        /**
         * @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 ItsIvim {
            
            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 ItsIvim {
            
            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 ItsIvim 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 ivimConfigurationFunctions {
        
        /**
         * @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 ItsIvim system ItsIvimSystem {
            
            map(self:acPort, system:acPort);
            map(self:utPort, system:utPort);
            map(self:ivimPort, system:ivimPort);
            f_connect4SelfOrClientSync();
            
Yann Garcia's avatar
Yann Garcia committed
            f_initialiseSecuredMode(p_certificateId); 
Yann Garcia's avatar
Yann Garcia committed
        function f_cfDown() runs on ItsIvim system ItsIvimSystem {
            // Initialise secured mode
            f_uninitialiseSecuredMode();
            
            unmap(self:acPort, system:acPort);
            unmap(self:utPort, system:utPort);
            unmap(self:ivimPort, system:ivimPort);
            f_disconnect4SelfOrClientSync();
            
    } // End of group ivimConfigurationFunctions
    
    group altsteps {
        
        /**
         * @desc The base default.
         */
        altstep a_default() runs on ItsIvim {
Yann Garcia's avatar
Yann Garcia committed
            [vc_ivimDefaultActive] ivimPort.receive(
garciay's avatar
garciay committed
                log("*** " & testcasename() & ": INFO: IVIM received in default ***");
Yann Garcia's avatar
Yann Garcia committed
            [vc_ivimDefaultActive] ivimPort.receive {
                log("*** " & testcasename() & ": ERROR: Received an unexpected message ***");
                f_selfOrClientSyncAndVerdict("error", e_error);
            }
            [] tc_wait.timeout {
                log("*** " & testcasename() & ": INCONC: Timeout while awaiting reaction of the IUT prior to Upper Tester action ***");
                f_selfOrClientSyncAndVerdict("error", e_timeout);
            }
            [] tc_ac.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 ItsIvim {
            var UtIvimEventInd v_event;
            [] utPort.receive(UtIvimEventInd:?) -> value v_event {
                //store every upper tester indication received
                vc_utEvents[lengthof(vc_utEvents)] := v_event;
                repeat;
            }
            [] utPort.receive {
                log("*** " & testcasename() & ": INFO: Received unhandled/unknown UT message from IUT ***");
                repeat;
            }
        }
        
    } // End of group altsteps
    
    group preambles {
        
        /**
         * @desc The default preamble.
         */
        function f_prDefault() runs on ItsIvim {
            vc_default := activate(a_default());
            activate(a_utDefault());
        }
        
        /**
         * @desc Brings the IUT into an initial state.
         * @return FncRetCode 
         */
//        function f_prInitialState(Scenario p_scenario := e_staticPosition) runs on ItsIvim return FncRetCode {
//            var FncRetCode v_ret := e_success;
//            
//            f_utInitializeIut(m_ivimStructureInitialize);
//            
//            f_prDefault();
//            
//            return v_ret;
//        }
        function f_prInitialState(Scenario p_scenario := e_staticPosition, // TODO: To be removed, not used in IVIM (RSU)
                                    in charstring p_certificate_id := ""
                                    ) runs on ItsIvim return FncRetCode {
            // Initialize IUT with given certificate
            if (p_certificate_id != "") { // Initialize IUT with given certificate
                var HashedId8 v_hashedId8 := '0000000000000000'O;
                
                fx_readCertificateDigest("CERT_IVI_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_ivimStructureInitialize(v_hashedId8));
            } else {
                f_utInitializeIut(m_ivimStructureInitialize);
            }
            f_prDefault();
            return v_ret;
        }
        
    } // End of group preambles
    
    group postambles {
        
        /**
         * @desc The default postamble.
         */
        function f_poDefault() runs on ItsIvim {
garciay's avatar
garciay committed
            // Nothing to do
        }
        
        /**
         * @desc Postamble including cancellation of an event.
         * @param p_trigger Indicates if the cancellation have to be raised by the test system(e_ets) 
         *                  or at the application layer of the IUT(e_iut).
         * @param p_actionId The action ID of the event to be cancelled
         */
        function f_poCancelEvent(
                                 in template (value) Trigger p_trigger, 
                                 in template (value) IviIdentificationNumber p_iviIdentificationNumber
        ) runs on ItsIvim {
            var FncRetCode v_ret := e_success;
            
            if (valueof(p_trigger) == e_ets) {
                f_sendIviMessage(valueof(m_ivimStructureCancellation(p_iviIdentificationNumber)));
                f_sleep(PX_TNOAC);
            }
            else {
                f_utTerminateEvent(m_utEventCancellation(p_iviIdentificationNumber));
            }
            
            f_poDefault();
        }
        
    } // End of group postambles
    
    group sendFunctions {
        
        /**
         * @desc Sends a IVI message
         * @param p_sendMsg The IVI message to send.
         * @param p_overrideSeqNo Overrides the sequence number with the stored one. 
         */
        function f_sendIviMessage(
                                  in template (value) IviStructure p_ivim
        ) runs on ItsIvim {
            ivimPort.send(
    
    group receiveFunctions {
        
        /**
         * @desc Awaits a IVI message and returns it
         * @param p_rcvMsg The expected message to be received.
         * @param p_rcvdMsg The received message - OUT.
         */
garciay's avatar
garciay committed
        function f_awaitIviMessage(
                                   in template (present) IvimInd p_rcvMsg, 
                                   out IvimInd p_rcvdMsg
        ) runs on ItsIvim {
            
            tc_ac.start;
            alt {
                [] ivimPort.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);
                }
garciay's avatar
garciay committed
            }
    } // End of group receiveFunctions
    
    group miscellaneousFunctions {
        
        /**
         * @desc Increases the IviIdentification number and handles the special case where the 
         *       IviIdentification number reaches the limit of 32768 and will be reset to 0.
         * @param p_iviIdentificationNumber The IviIdentification number to increase.
         * @return The increased IviIdentification number.
         */
garciay's avatar
garciay committed
        function f_increaseIviIdentificationNumber(
                                                   in IviIdentificationNumber p_iviIdentificationNumber
        ) return IviIdentificationNumber {
            // if maximum number of 32768 reached, reset it to 0
            return ((p_iviIdentificationNumber + 1) mod 32768);
        }
        
    } // End of group miscellaneousFunctions
    
} // End of module LibItsIvim_Functions