| Directory: | ./ |
|---|---|
| File: | src/PAbstractConnector.h |
| Date: | 2024-12-09 11:00:39 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 36 | 40 | 90.0% |
| Branches: | 32 | 58 | 55.2% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /*************************************** | ||
| 2 | Auteur : Pierre Aubert | ||
| 3 | Mail : pierre.aubert@lapp.in2p3.fr | ||
| 4 | Licence : CeCILL-C | ||
| 5 | ****************************************/ | ||
| 6 | |||
| 7 | #ifndef __PABSTRACTCONNECTOR_H__ | ||
| 8 | #define __PABSTRACTCONNECTOR_H__ | ||
| 9 | |||
| 10 | #include "PAbstractInternalVar.h" | ||
| 11 | |||
| 12 | ///@brief Abstract connector to exchange data/states/method calls with other server/client | ||
| 13 | template<typename _TBackend, typename _TMockBackend> | ||
| 14 | class PAbstractConnector{ | ||
| 15 | public: | ||
| 16 | PAbstractConnector(ConnectorMode::ConnectorMode mode, const typename _TMockBackend::Param & param, typename _TBackend::Manager * manager, typename _TMockBackend::Manager * mockManager); | ||
| 17 | virtual ~PAbstractConnector(); | ||
| 18 | |||
| 19 | bool createClientConnector(const std::string & address, const typename _TBackend::Param & param); | ||
| 20 | bool createServerConnector(const std::string & address, const typename _TBackend::Param & param); | ||
| 21 | |||
| 22 | bool registerVar(const PComposeVar & composeVar); | ||
| 23 | bool registerCall(const PFunctionPrototype & prototype); | ||
| 24 | |||
| 25 | bool pushMsg(const std::string & varName, const typename _TBackend::Message & msg); | ||
| 26 | template<typename T> | ||
| 27 | 72 | bool pushData(const std::string & varName, const T & data){ | |
| 28 | 72 | size_t dataSize(data_size<T>(data)); | |
| 29 | 72 | bool b(true); | |
| 30 |
2/2✓ Branch 0 taken 52 times.
✓ Branch 1 taken 20 times.
|
72 | if(p_mode != ConnectorMode::MOCK){ |
| 31 |
1/1✓ Branch 2 taken 52 times.
|
52 | typename _TBackend::Message msg(dataSize); |
| 32 |
1/1✓ Branch 1 taken 52 times.
|
52 | char* iter = _TMockBackend::msgData(msg); |
| 33 |
2/3✓ Branch 1 taken 52 times.
✓ Branch 3 taken 52 times.
✗ Branch 4 not taken.
|
52 | if(data_message_save<char*, T>(iter, data)){ //Save the message |
| 34 |
1/1✓ Branch 1 taken 52 times.
|
52 | b &= _TBackend::push(p_connector, varName, msg); |
| 35 | } | ||
| 36 | 52 | } | |
| 37 |
3/4✓ Branch 0 taken 30 times.
✓ Branch 1 taken 42 times.
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
|
72 | if(p_mode != ConnectorMode::NO_MOCK && b){ |
| 38 | 30 | typename _TMockBackend::Message vecTmpMsg; | |
| 39 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | _TMockBackend::msgResize(vecTmpMsg, dataSize); |
| 40 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | char* iter = _TMockBackend::msgData(vecTmpMsg); |
| 41 |
2/4✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 30 times.
✗ Branch 4 not taken.
|
30 | if(data_message_save<char*, T>(iter, data)){ //Save the message |
| 42 |
1/2✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
|
30 | b &= _TMockBackend::push(p_mockConnector, varName, vecTmpMsg); |
| 43 | } | ||
| 44 | 30 | } | |
| 45 | 72 | return b; | |
| 46 | } | ||
| 47 | |||
| 48 | bool pullMsg(const std::string & varName, typename _TBackend::Message & msg); | ||
| 49 | template<typename T> | ||
| 50 | 30 | bool pullData(const std::string & varName, T & data){ | |
| 51 | 30 | bool b(true); | |
| 52 |
1/2✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
|
30 | if(p_mode != ConnectorMode::MOCK){ //If we are not in mock mode, we use the backend as usual |
| 53 | 30 | typename _TBackend::Message msg; | |
| 54 |
2/3✓ Branch 1 taken 30 times.
✓ Branch 3 taken 30 times.
✗ Branch 4 not taken.
|
30 | if(_TBackend::pull(p_connector, varName, msg)){ |
| 55 |
3/3✓ Branch 1 taken 30 times.
✓ Branch 3 taken 20 times.
✓ Branch 4 taken 10 times.
|
30 | if(_TBackend::msgSize(msg) != 0lu){ //The message can be empty |
| 56 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
20 | char* iter = _TMockBackend::msgData(msg); |
| 57 |
1/2✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
|
20 | b &= data_message_load<T>(iter, data); //Load the message |
| 58 | } | ||
| 59 | } | ||
| 60 | 30 | } | |
| 61 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
|
30 | if(p_mode == ConnectorMode::MOCK){ |
| 62 | ✗ | typename _TMockBackend::Message vecTmpMsg; | |
| 63 | ✗ | if(_TMockBackend::pull(p_mockConnector, varName, vecTmpMsg)){ | |
| 64 | ✗ | char* iter = _TMockBackend::msgData(vecTmpMsg); | |
| 65 | ✗ | b &= data_message_load<T>(iter, data); //Load the message | |
| 66 | } | ||
| 67 |
2/2✓ Branch 1 taken 10 times.
✓ Branch 2 taken 20 times.
|
30 | }else if(p_mode == ConnectorMode::MOCK_RECORD){ |
| 68 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | size_t dataSize(data_size<T>(data)); |
| 69 | 10 | typename _TMockBackend::Message vecTmp; | |
| 70 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | _TMockBackend::msgResize(vecTmp, dataSize); |
| 71 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | char* iter = _TMockBackend::msgData(vecTmp); |
| 72 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
|
10 | if(data_message_save<char*, T>(iter, data)){ //Save the message |
| 73 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
10 | b &= _TMockBackend::pull(p_mockConnector, varName, vecTmp); //Save converted msg in mock pull |
| 74 | } | ||
| 75 | 10 | } | |
| 76 | 30 | return b; | |
| 77 | } | ||
| 78 | |||
| 79 | bool call(PFunctionCall & methodCall); | ||
| 80 | void setMapInternalVarPtr(std::map<std::string, PGenericInternalVar<_TBackend, _TMockBackend>* > * mapInternalVar); | ||
| 81 | |||
| 82 | private: | ||
| 83 | void initialisationPAbstractConnector(ConnectorMode::ConnectorMode mode, const typename _TMockBackend::Param & mockparam, typename _TBackend::Manager * manager, typename _TMockBackend::Manager * mockManager); | ||
| 84 | |||
| 85 | ///Connector to be used to call other server/client | ||
| 86 | typename _TBackend::Connector p_connector; | ||
| 87 | ///Mode of the Connector (no mock, mock, mock_record) | ||
| 88 | ConnectorMode::ConnectorMode p_mode; | ||
| 89 | ///Parameters of the mock backend | ||
| 90 | typename _TMockBackend::Param p_mockParam; | ||
| 91 | ///TODO : for the future : Limit the number of recorded states to use less memory | ||
| 92 | // size_t p_limitNbState; | ||
| 93 | ///Contains all the mock information | ||
| 94 | typename _TMockBackend::Connector p_mockConnector; | ||
| 95 | ///Map of internal variables (will be allocated by PAbstractConnectorManager) | ||
| 96 | std::map<std::string, PGenericInternalVar<_TBackend, _TMockBackend>* > * p_mapInternalVar; | ||
| 97 | |||
| 98 | ///Data of the manager | ||
| 99 | typename _TBackend::Manager* p_manager; | ||
| 100 | ///Data of the mock manager | ||
| 101 | typename _TMockBackend::Manager* p_mockManager; | ||
| 102 | }; | ||
| 103 | |||
| 104 | #include "PAbstractConnector_impl.h" | ||
| 105 | |||
| 106 | |||
| 107 | #endif | ||
| 108 | |||
| 109 |