| /////////////////////////////////////////////////////////////////////////////// |
| // // |
| // Copyright (c) 2000-2019 Ericsson Telecom AB // |
| // // |
| // All rights reserved. This program and the accompanying materials // |
| // are made available under the terms of the Eclipse Public License v2.0 // |
| // which accompanies this distribution, and is available at // |
| // https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| /////////////////////////////////////////////////////////// |
| // Module: EPTF_CLL_Base_Definitions |
| // |
| // Purpose: |
| // This module contains common type definitions that should be used in all EPTF Components. |
| // |
| // The Base feature provides functions to: |
| // - stores the name of the component |
| // - gracefully terminate the application via the init-cleanup mechanism |
| // - convert the component types extending EPTF_Base_CT to/from integer |
| // - access the system and component time |
| // - error and assert management with negative test mode support |
| // - provide process information on every PTC running on components extending the EPTF_Base_CT |
| // |
| // Module Parameters: |
| // tsp_EPTF_Base_serialStopAllComponents - *boolean* - if true: components are stopped one after another, otherwise: in parallel (faster, but might lead to errors). Default: true |
| // tsp_EPTF_Base_debug - *boolean* - if true: the debug style messages appear in the logs. Default: false |
| // |
| // Module depends on: |
| // <EPTF_CLL_Common_Definitions> |
| // |
| // Current Owner: |
| // Jozsef Gyurusi (ETHJGI) |
| // |
| // Last Review Date: |
| // 2007-12-06 |
| // |
| // Detailed Comments: |
| // This module contains common type definitions that should be used in all EPTF Components. |
| // All EPTF Components should extend the EPTF_Base_CT. |
| // |
| // In all components that extend EPTF_Base_CT the following rules has to be followed: |
| // - in your init function call all the init functions of all those components that your component extends explicitly, |
| // e.g. the <f_EPTF_Base_init_CT> in case your component extends the <EPTF_Base_CT> component. |
| // - after that, initialize your component variables |
| // - activate your default altsteps |
| // - register your cleanup function by <f_EPTF_Base_registerCleanup> at the end of your init function |
| // - call <f_EPTF_Base_cleanup_CT> before your component terminates |
| // or call <f_EPTF_Base_stop> if the execution should be stopped (e.g. because of an error the execution is forced to stop immediately) |
| // - do not call any cleanup function anywhere, especially inside your cleanup function. |
| // Only the cleanup function of the Base component should be called |
| // - make sure that any event that comes after the cleanup function was called, is discarded (does not cause problems) |
| // e.g. by deactivating your default altsteps in your cleanup function. |
| // - make sure, that if any of your functions is called if your feature is not initialized, |
| // it does not cause an error, similarly port operations (send function) does not cause error if the port is not connected |
| // - make sure, that your init and cleanup functions can be called several times (with doing nothing during the additional calls)! |
| // |
| // The role of the init and cleanup functions is similar to the constructors and destructors in C++. |
| // |
| // A typical example of an init function if EPTF_USER_CT extends MyParent1_CT, MyParent2_CT: |
| //function f_EPTF_USER_init_CT(in charstring pl_selfName /* your additional input parameters */) runs on USER_CT { |
| // if (v_USER_initialized) { |
| // return; |
| // } |
| // |
| // // call all the init functions of the components that your component extends _explicitly_: |
| // f_MyParent1_init_CT(pl_selfName /*additional parameters*/); |
| // f_MyParent2_init_CT(pl_selfName /*additional parameters*/); |
| // |
| // // initialize your component variables here... |
| // |
| // // activate your default altsteps here... |
| // |
| // v_USER_initialized := true; |
| // |
| // // register your cleanup function: |
| // f_EPTF_Base_registerCleanup(refers(f_USER_cleanup_CT)); |
| // |
| // log("----USER INIT DONE----"); |
| //} |
| // |
| // |
| // A typical example of a USER cleanup function: |
| //function f_USER_cleanup_CT() runs on USER_CT { |
| // if (v_USER_initialized == false) { |
| // return; |
| // } |
| // v_USER_initialized := false; |
| // |
| // // reset your variables here if needed... |
| // |
| // // Do not call any cleanup function inside this function! |
| // |
| // // if you have a connected port disconnect it using a 'bye' messages like this: |
| // // (the handlers of the bye should be added into the main alt loop. |
| // // The bye handlers should remove the remote party from the database, send byeAck and call repeat) |
| // // (the handlers of the byeAck should be added into the main alt loop. |
| // // The byeAck handlers should remove the remote party from the database, and call repeat) |
| // // send bye only if remote party did not send bye to me and I responded to it: |
| // f_USER_Send_ByeToAllInDatabase(); |
| // timer t_maxWait := 30.0; |
| // t_maxWait.start; |
| // // to block execution until all byeAck arrives use: t_byeAck and f_USER_allByeAck_received() |
| // timer t_byeAck := 0.0; t_byeAck.start; |
| // alt { |
| // [] t_maxWait.timeout { |
| // log("WARNING:","--USER CLEANUP TIMEOUT-- Not all responses received for bye messages. Exiting anyway..."); |
| // // exit from alt |
| // } |
| // [f_USER_allByeAck_received()] t_byeAck.timeout { |
| // // all bye ack arrived, can go on now |
| // } |
| // } |
| // |
| // // deactivate your default altsteps here if needed... |
| // |
| // log("----USER CLEANUP DONE----"); |
| //} |
| // |
| /////////////////////////////////////////////////////////////// |
| |
| module EPTF_CLL_Base_Definitions { |
| |
| import from EPTF_CLL_Common_Definitions all; // tsp_EPTF_maxRunningTime |
| |
| modulepar boolean tsp_EPTF_Base_serialStopAllComponents := true; // if true: components are stopped one after another, otherwise: in parallel (faster, but might lead to errors). Default: true |
| modulepar boolean tsp_EPTF_Base_debug := false; //if true: the debug style messages appear in the logs. Default: false |
| modulepar boolean tsp_EPTF_Base_enableDTEHandling := true; // to disable DTE handling globally set this parameter to false |
| |
| /////////////////////////////////////////////////////////// |
| // Type: f_EPTF_Feature_cleanup_CT |
| // |
| // Purpose: |
| // General function type of the cleanup functions |
| // |
| // Elements: |
| // - |
| // |
| // Detailed Comments: |
| // |
| /////////////////////////////////////////////////////////// |
| type function f_EPTF_Feature_cleanup_CT() runs on self; |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_CleanupFunctions |
| // |
| // Purpose: |
| // List of <f_EPTF_Feature_cleanup_CT> |
| // |
| // Elements: |
| // - |
| // |
| // Detailed Comments: |
| // |
| /////////////////////////////////////////////////////////// |
| type record of f_EPTF_Feature_cleanup_CT EPTF_Base_CleanupFunctions; |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_ComponentList |
| // |
| // Purpose: |
| // List of <EPTF_Base_CT> |
| // |
| // Elements: |
| // - |
| // |
| // Detailed Comments: |
| // |
| /////////////////////////////////////////////////////////// |
| type record of EPTF_Base_CT EPTF_Base_ComponentList; |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_ComponentInfo |
| // |
| // Purpose: |
| // List of <EPTF_Base_CT> |
| // |
| // Elements: |
| // selfName - *charstring* - the name of the component (returned by <f_EPTF_Base_selfName>) |
| // compRef - <EPTF_Base_CT_private> - the reference to the component |
| // hostName - *charstring* - the name of the component (returned by <f_EPTF_Base_getHostName>) |
| // pid - *integer* - process ID of PTC where the component is running |
| // |
| // Detailed Comments: |
| // |
| /////////////////////////////////////////////////////////// |
| type record EPTF_Base_ComponentInfo { |
| charstring selfName, |
| EPTF_Base_CT compRef, |
| charstring hostName, |
| integer pid |
| } |
| |
| const EPTF_Base_ComponentInfo c_EPTF_Base_ComponentInfo_init := { |
| "",null,"",-1 |
| } |
| |
| type record of EPTF_Base_ComponentInfo EPTF_Base_ComponentInfoList; |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_MgmtMsg |
| // |
| // Purpose: |
| // This union defines the management message type sent/received by the <EPTF_Base_Mgmt_PT> |
| // |
| // Elements: |
| // hello - <EPTF_Base_Msg_Hello> - hello message sent to the mtc to register component creation |
| // bye - <EPTF_Base_Msg_Bye> - bye message sent to the mtc to notify it about the termination of the sender component |
| // byeAck - <EPTF_Base_Msg_ByeAck> - byeAck message sent by the mtc to the client to notify it has received the bye message, the client can terminate now |
| // stopRemote - <EPTF_Base_Msg_StopRemote> - the component which receives this message should stop gracefully |
| // |
| // Detailed Comments: |
| // |
| /////////////////////////////////////////////////////////// |
| type union EPTF_Base_MgmtMsg { |
| EPTF_Base_Msg_Hello hello, // hello message sent to the mtc to register component creation |
| EPTF_Base_Msg_GetCompInfo getCompInfo, // getCompInfo message sent to the mtc to get info about a component |
| EPTF_Base_Msg_GetCompInfoResult getCompInfoResult, // getCompInfoResult message sent from mtc to as a response to the getCompInfo msg |
| EPTF_Base_Msg_GetCompInfoAll getCompInfoAll, // getCompInfoAll message sent to the mtc to get info about a component |
| EPTF_Base_Msg_GetCompInfoAllResult getCompInfoAllResult, // getCompInfoAllResult message sent from mtc to as a response to the getCompInfoAll msg |
| EPTF_Base_Msg_Bye bye, // bye message sent to the mtc to notify it about the termination of the sender component |
| EPTF_Base_Msg_ByeAck byeAck, // byeAck message sent by the mtc to the client to notify it has received the bye message, the client can terminate now |
| EPTF_Base_Msg_StopRemote stopRemote // the component which receives this message should stop gracefully |
| } |
| |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Msg_Hello |
| // |
| // Purpose: |
| // This record defines the management message type |
| // |
| // Elements: |
| // |
| // Detailed Comments: |
| // It is sent to notify the mtc about the creation of the sender component |
| // |
| /////////////////////////////////////////////////////////// |
| type record EPTF_Base_Msg_Hello { |
| integer myPid, |
| charstring myName, |
| charstring myHostName |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Msg_GetCompInfo |
| // |
| // Purpose: |
| // This record defines the management message type GetCompInfo |
| // |
| // Elements: |
| // |
| // Detailed Comments: |
| // It is sent to the mtc to get info about the component |
| // with the given selfName |
| // |
| /////////////////////////////////////////////////////////// |
| type record EPTF_Base_Msg_GetCompInfo { |
| integer msgId, |
| charstring selfName |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Msg_GetCompInfoResult |
| // |
| // Purpose: |
| // This record defines the management message type GetCompInfoResult |
| // |
| // Elements: |
| // |
| // Detailed Comments: |
| // It is the result coming from mtc that contains the result |
| // for <EPTF_Base_Msg_GetCompInfo> |
| // |
| /////////////////////////////////////////////////////////// |
| type record EPTF_Base_Msg_GetCompInfoResult { |
| integer msgId, |
| EPTF_Base_ComponentInfo compInfo, |
| integer errorCode |
| } |
| |
| const EPTF_Base_Msg_GetCompInfoResult c_EPTF_Base_Msg_GetCompInfoResult_init := { |
| -1,c_EPTF_Base_ComponentInfo_init,-1 |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Msg_GetCompInfoAll |
| // |
| // Purpose: |
| // This record defines the management message type GetCompInfoAll |
| // |
| // Elements: |
| // |
| // Detailed Comments: |
| // It is sent to the mtc to get info about the component |
| // with the given selfName |
| // |
| /////////////////////////////////////////////////////////// |
| type record EPTF_Base_Msg_GetCompInfoAll { |
| integer msgId |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Msg_GetCompInfoAllResult |
| // |
| // Purpose: |
| // This record defines the management message type GetCompInfoAllResult |
| // |
| // Elements: |
| // |
| // Detailed Comments: |
| // It is the result coming from mtc that contains the result |
| // for <EPTF_Base_Msg_GetCompInfoAll> |
| // |
| /////////////////////////////////////////////////////////// |
| type record EPTF_Base_Msg_GetCompInfoAllResult { |
| integer msgId, |
| EPTF_Base_ComponentInfoList compInfoAll |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Msg_GetCompInfoResults |
| // |
| // Purpose: |
| // This record of defines the management message buffer type |
| // |
| // Elements: |
| // |
| // Detailed Comments: |
| // |
| /////////////////////////////////////////////////////////// |
| type record of EPTF_Base_Msg_GetCompInfoResult EPTF_Base_Msg_GetCompInfoResults; |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Msg_Bye |
| // |
| // Purpose: |
| // This record defines the management message type |
| // |
| // Elements: |
| // |
| // Detailed Comments: |
| // It is sent to notify the mtc about the termination of the sender component |
| // |
| /////////////////////////////////////////////////////////// |
| type record EPTF_Base_Msg_Bye { |
| }; |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Msg_ByeAck |
| // |
| // Purpose: |
| // This record defines the management message type |
| // |
| // Elements: |
| // |
| // Detailed Comments: |
| // It is sent by the mtc to notify the client that it recceived the bye message and the client can terminate |
| // |
| /////////////////////////////////////////////////////////// |
| type EPTF_Base_Msg_Bye EPTF_Base_Msg_ByeAck; |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Msg_StopRemote |
| // |
| // Purpose: |
| // This record defines the management message type |
| // |
| // Elements: |
| // stopRemote - <EPTF_Base_Msg_StopRemote> - the component which receives this message should stop gracefully |
| // noCleanup - *boolean* - true of no cleanup needed |
| // |
| // Detailed Comments: |
| // |
| /////////////////////////////////////////////////////////// |
| type record EPTF_Base_Msg_StopRemote { |
| boolean noCleanup |
| } |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_Mgmt_PT |
| // |
| // Purpose: |
| // The management port of <EPTF_Base_CT> component |
| // |
| // Elements: |
| // - |
| // |
| // Detailed Comments: |
| // |
| /////////////////////////////////////////////////////////// |
| type port EPTF_Base_Mgmt_PT message { |
| inout EPTF_Base_MgmtMsg; |
| } with {extension "internal"} |
| |
| /////////////////////////////////////////////////////////// |
| // Type: EPTF_Base_CheckCondition_FT |
| // |
| // Purpose: |
| // General function to check a condition |
| // |
| // Parameters: |
| // - |
| // |
| // Return Value: |
| // boolean - True if condition is fulfilled, false otherwise |
| // |
| // Errors & assertions: |
| // - |
| // |
| // Detailed Comments: |
| // Can be used in alt statements to wake up when the condition becomes true |
| // Used by <f_EPTF_Base_waitForCondition> |
| // |
| // |
| /////////////////////////////////////////////////////////// |
| type function EPTF_Base_CheckCondition_FT() runs on self return boolean; |
| |
| /////////////////////////////////////////////////////////// |
| // Component: EPTF_Base_CT |
| // |
| // Purpose: |
| // The component hides the internal members of the EPTF Base feature |
| // |
| // Elements: |
| // |
| // Detailed Comments: |
| // To use the any EPTF Feature, extend your component with <EPTF_Base_CT> |
| // |
| /////////////////////////////////////////////////////////// |
| type component EPTF_Base_CT extends EPTF_Base_CT_private { |
| } |
| |
| friend module EPTF_CLL_Base_Functions; |
| /////////////////////////////////////////////////////////// |
| // Component: EPTF_Base_CT_private |
| // |
| // Purpose: |
| // The component that implements the EPTF Base feature, that are common in all EPTF components |
| // |
| // Elements: |
| // v_selfName - *charstring* - user given name of the component |
| // v_initialized - *boolean* - prevents multiple init by calling <f_EPTF_Base_init_CT> several times |
| // v_EPTF_Base_cleanupFunctions - <EPTF_Base_CleanupFunctions> - the database of the cleanup functions |
| // EPTF_Base_MgmtIf - <EPTF_Base_Mgmt_PT> - the management port |
| // v_EPTF_Base_def - *default* - reference to the default altstep |
| // v_EPTF_Base_componentsToStop - <EPTF_Base_ComponentList> - list of components that should be stopped |
| // v_EPTF_Base_componentInfoList - <EPTF_Base_ComponentInfoList> - list of all EPTF_Base components |
| // v_EPTF_Base_getCompInfoResult - <EPTF_Base_Msg_GetCompInfoResults> - to store the result msg for GetCompInfo |
| // v_EPTF_Base_serialStopAllComponents - *boolean* - if true: components are stopped one after another, otherwise: in parallel. Default: tsp_EPTF_Base_slowStopAllComponents |
| // v_EPTF_Base_disableBye - *boolean* - true if bye message should not be sent |
| // v_EPTF_Base_byeAckReceived - *boolean* - true if byeAck has arrived |
| // v_EPTF_Base_stopRemoteSentTo - <EPTF_Base_CT> - component reference to the component that is being stopped by stopRemote |
| // T_EPTF_componentClock - *timer* - is the "wall clock" of the component |
| // it is to be started upon execution starts and it is supposed to never expire |
| // v_EPTF_Base_negativeTestMode - *boolean* - if false: verdict is set by <f_EPTF_Base_assert>, otherwise not |
| // v_EPTF_Base_assertMsgs - <EPTF_CharstringList> - the list of assert messages |
| // v_EPTF_Base_expectedAssert - *charstring* - the expected assert message at cleanup |
| // v_EPTF_Base_enableDTEHandling - *boolean* - if true DTE handling will be enabled in other features like LGenBase, Scheduler, Transport |
| // |
| // Detailed Comments: |
| // To use the any EPTF Feature, extend your component with <EPTF_Base_CT> |
| // |
| /////////////////////////////////////////////////////////// |
| friend type component EPTF_Base_CT_private { |
| private var charstring v_selfName; |
| private var boolean v_EPTF_Base_initialized := false; |
| private var EPTF_Base_CleanupFunctions v_EPTF_Base_cleanupFunctions := {}; |
| private port EPTF_Base_Mgmt_PT EPTF_Base_MgmtIf; // management interface |
| private var default v_EPTF_Base_def; // reference to the default altstep |
| private var EPTF_Base_ComponentList v_EPTF_Base_componentsToStop := {}; // list of components that should be stopped |
| private var EPTF_Base_ComponentInfoList v_EPTF_Base_componentInfoList := {}; // list of all EPTF_Base components |
| private var EPTF_Base_Msg_GetCompInfoResults v_EPTF_Base_getCompInfoResult := {}; // to store the result msg for GetCompInfo |
| private var boolean v_EPTF_Base_serialStopAllComponents := tsp_EPTF_Base_serialStopAllComponents; // if true: components are stopped one after another, otherwise: in parallel. Default: tsp_EPTF_Base_serialStopAllComponents |
| private var boolean v_EPTF_Base_disableBye := false; // true if bye message should not be sent |
| private var boolean v_EPTF_Base_byeAckReceived := false; // true if byeAck has arrived |
| private var EPTF_Base_CT v_EPTF_Base_stopRemoteSentTo := null; // component reference to the component that is being stopped by stopRemote |
| // This timer has been assumed to never expire, but can be read as clock reference |
| /* private*/ timer T_EPTF_componentClock := tsp_EPTF_maxRunningTime; |
| private var float v_EPTF_Base_abstimeOfZeroComponentClock := 0.0; // abstime in secs, as in gettimeofday() |
| |
| private var boolean v_EPTF_Base_negativeTestMode := false; // if false: verdict is set by <f_EPTF_Base_assert>, otherwise not |
| private var EPTF_CharstringList v_EPTF_Base_assertMsgs := {}; // the list of assert messages |
| private var charstring v_EPTF_Base_expectedAssert := ""; // the expected assert message at cleanup |
| private var charstring v_EPTF_Base_expectedError := ""; // the expected error message at cleanup |
| |
| //global switch for DTE handling: |
| private var boolean v_EPTF_Base_enableDTEHandling := tsp_EPTF_Base_enableDTEHandling; |
| } |
| |
| } // end of module |