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 |