GCC Code Coverage Report


Directory: ./
File: src/PAbstractControlManager.h
Date: 2024-12-09 11:00:39
Exec Total Coverage
Lines: 62 68 91.2%
Branches: 42 52 80.8%

Line Branch Exec Source
1 /***************************************
2 Auteur : Pierre Aubert
3 Mail : pierre.aubert@lapp.in2p3.fr
4 Licence : CeCILL-C
5 ****************************************/
6
7 #ifndef __PABSTRACTCONTROLMANAGER_H__
8 #define __PABSTRACTCONTROLMANAGER_H__
9
10 #include "PAbstractConnector.h"
11
12 ///@brief Abtract class which defines Control manager with arbitrary backend
13 template<typename _TConnectorKey, typename _TBackend, typename _TMockBackend>
14 class PAbstractControlManager{
15 public:
16 PAbstractControlManager(ConnectorMode::ConnectorMode mode = ConnectorMode::NO_MOCK, const typename _TBackend::MgrParam & mgrParam = _TBackend::defaultMgrParam(), const typename _TMockBackend::Param & mockParam = _TMockBackend::defaultParam(), const typename _TMockBackend::MgrParam & mockMgrParam = _TMockBackend::defaultMgrParam());
17 virtual ~PAbstractControlManager();
18
19 bool addClientConnector(const _TConnectorKey & name, const std::string & hostName, const typename _TBackend::Param & param);
20 bool addServerConnector(const _TConnectorKey & name, const std::string & hostName, const typename _TBackend::Param & param);
21
22 void removeConnector(const _TConnectorKey & name);
23 void clearConnector();
24 void clear();
25
26 bool registerVar(const _TConnectorKey & name, const PComposeVar & composeVar);
27 bool registerCall(const _TConnectorKey & name, const PFunctionPrototype & prototype);
28
29 ///Register a variable
30 /** @param name : name of the connector to be used
31 * @param varName : name of the variable to be used
32 * @return true on success, false otherwise
33 */
34 template<typename T>
35 1 bool registerVar(const _TConnectorKey & name, const std::string & varName){
36
1/1
✓ Branch 2 taken 1 times.
1 return registerVar(name, phoenix_getComposeVar<T>(varName));
37 }
38
39 ///Register a method to be called
40 /** @param name : name of the connector to be used
41 * @param functionName : name of the method to be used
42 * @param __f : C++ protoype of the function
43 * @return true on success, false otherwise
44 */
45 template<typename _Callable>
46 1 bool registerCall(const _TConnectorKey & name, const std::string & functionName, _Callable&& __f){
47
1/1
✓ Branch 2 taken 1 times.
1 return registerCall(name, phoenix_getPrototype(functionName, __f));
48 }
49
50
51 bool pushMsg(const _TConnectorKey & name, const std::string & varName, const typename _TBackend::Message & msg);
52
53 ///Push data to a remote server
54 /** @param name : name of the connector to be used
55 * @param varName : name of the variable to be pused
56 * @param value : value to be pused
57 * @return true on success, false otherwise
58 */
59 template<typename T>
60 73 bool pushData(const _TConnectorKey & name, const std::string & varName, const T & value){
61 73 PAbstractConnector<_TBackend, _TMockBackend> * connector = getConnector(name);
62
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 1 times.
73 if(connector != NULL){
63 72 return connector->pushData(varName, value);
64 }else{
65 1 return false;
66 }
67 }
68
69 bool pullMsg(const _TConnectorKey & name, const std::string & varName, typename _TBackend::Message & msg);
70
71 ///Pull data from a remote server
72 /** @param name : name of the connector to be used
73 * @param varName : name of the variable to be pused
74 * @param value : value to be pulled
75 * @return true on success, false otherwise
76 */
77 template<typename T>
78 30 bool pullData(const _TConnectorKey & name, const std::string & varName, T & value){
79 30 PAbstractConnector<_TBackend, _TMockBackend> * connector = getConnector(name);
80
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
30 if(connector != NULL){
81 30 return connector->pullData(varName, value);
82 }else{
83 return false;
84 }
85 }
86 bool call(const _TConnectorKey & name, PFunctionCall & methodCall);
87
88 ///Call a remote method
89 /** @param name : name of the connector to be used
90 * @param functionName : name of the method to be called
91 * @param __args : arguments to call the method
92 * @return true on success, false otherwise
93 */
94 template<typename... _Args>
95 20 bool call(const _TConnectorKey & name, const std::string & functionName, _Args&&... __args){
96 20 PAbstractConnector<_TBackend, _TMockBackend> * connector = getConnector(name);
97
1/2
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
20 if(connector != NULL){
98
1/1
✓ Branch 1 taken 20 times.
20 PFunctionCall methodCall;
99
1/1
✓ Branch 1 taken 20 times.
20 phoenix_serialiseCallParam(methodCall, functionName, __args...);
100
1/1
✓ Branch 1 taken 20 times.
20 return connector->call(methodCall);
101 20 }else{
102 return false;
103 }
104 }
105
106 void removeInternalVar(const std::string & varName);
107 void clearAllInternalVar();
108
109 ///Register a local variable
110 /** @param varName : name of the variable
111 * @param defaultValue : default value of the variable
112 * @return true on success, false otherwise
113 */
114 template<typename T>
115 2 bool registerLocalVar(const std::string & varName, const T & defaultValue){
116
1/1
✓ Branch 2 taken 2 times.
2 PAbstractInternalVar<T, _TBackend, _TMockBackend> * var = new PAbstractInternalVar<T, _TBackend, _TMockBackend>(defaultValue, varName, p_mode, p_mockParam);
117 2 bool b(true);
118
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if(var != NULL){
119 2 p_mapInternalVar[varName] = (PGenericInternalVar<_TBackend, _TMockBackend>*)var;
120
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if(p_mode != ConnectorMode::MOCK){ //Let's register the local variable in backend
121 2 b = _TBackend::registerLocalVar(p_manager, var->getComposeVar());
122 }
123
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if(p_mode != ConnectorMode::NO_MOCK){ //Let's register the local variable in mock backend
124 1 b = _TMockBackend::registerLocalVar(p_mockManager, var->getComposeVar());
125 }
126 }
127 2 return b;
128 }
129
130 ///Read the value of a local variable
131 /** @param varName : name of the variable
132 * @param[out] value : value of the variable
133 * @return true on success, false otherwise
134 */
135 template<typename T>
136 20 bool getLocalVar(const std::string & varName, T & value){
137 //Let's check if the varName does exist
138
1/1
✓ Branch 1 taken 20 times.
20 typename std::map<std::string, PGenericInternalVar<_TBackend, _TMockBackend>* >::iterator it(p_mapInternalVar.find(varName));
139
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 20 times.
20 if(it == p_mapInternalVar.end()){
140 //TODO : we should call an error method in the backend to propagate the error properly
141 return false;
142 }
143 20 const PComposeVar & localVar =it->second->getComposeVar();
144 //Here the variable name is found, so we will check its type
145
1/1
✓ Branch 1 taken 20 times.
20 PComposeVar inputVar = phoenix_getComposeVar<T>(varName);
146
5/6
✓ Branch 1 taken 20 times.
✓ Branch 4 taken 20 times.
✓ Branch 8 taken 20 times.
✓ Branch 11 taken 20 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 20 times.
20 if(!checkValue("getLocalVar : wrong type", inputVar.getType(), localVar.getType())){
147 return false;
148 }
149 20 PAbstractInternalVar<T, _TBackend, _TMockBackend>* var = (PAbstractInternalVar<T, _TBackend, _TMockBackend>*)it->second;
150 20 value = var->getValue();
151 20 bool b(true);
152
1/1
✓ Branch 1 taken 20 times.
20 var->saveValueToComposeVar();
153
1/2
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
20 if(p_mode != ConnectorMode::MOCK){ //Let's register the local variable in backend
154
1/1
✓ Branch 2 taken 20 times.
20 b &= _TBackend::getLocalVar(p_manager, var->getComposeVar());
155 }
156
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
20 if(p_mode != ConnectorMode::NO_MOCK){ //Let's register the local variable in backend
157
1/1
✓ Branch 2 taken 10 times.
10 b &= _TMockBackend::getLocalVar(p_mockManager, var->getComposeVar());
158 }
159 20 return b;
160 20 }
161
162 ///Set the value of a local variable
163 /** @param varName : name of the variable
164 * @param value : value of the variable
165 * @return true on success, false otherwise
166 */
167 template<typename T>
168 20 bool setLocalVar(const std::string & varName, const T & value){
169 //Let's check if the varName does exist
170
1/1
✓ Branch 1 taken 20 times.
20 typename std::map<std::string, PGenericInternalVar<_TBackend, _TMockBackend>* >::iterator it(p_mapInternalVar.find(varName));
171
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 20 times.
20 if(it == p_mapInternalVar.end()){
172 //TODO : we should call an error method in the backend to propagate the error properly
173 return false;
174 }
175 20 const PComposeVar & localVar =it->second->getComposeVar();
176 //Here the variable name is found, so we will check its type
177
1/1
✓ Branch 1 taken 20 times.
20 PComposeVar inputVar = phoenix_getComposeVar<T>(varName);
178
5/6
✓ Branch 1 taken 20 times.
✓ Branch 4 taken 20 times.
✓ Branch 8 taken 20 times.
✓ Branch 11 taken 20 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 20 times.
20 if(!checkValue("setLocalVar : wrong type", inputVar.getType(), localVar.getType())){
179 return false;
180 }
181 20 PAbstractInternalVar<T, _TBackend, _TMockBackend>* var = (PAbstractInternalVar<T, _TBackend, _TMockBackend>*)it->second;
182 20 var->setValue(value);
183
1/1
✓ Branch 1 taken 20 times.
20 var->saveValueToComposeVar();
184 20 bool b(true);
185
1/2
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
20 if(p_mode != ConnectorMode::MOCK){ //Let's register the local variable in backend
186
1/1
✓ Branch 2 taken 20 times.
20 b &= _TBackend::setLocalVar(p_manager, var->getComposeVar());
187 }
188
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
20 if(p_mode != ConnectorMode::NO_MOCK){ //Let's register the local variable in backend
189
1/1
✓ Branch 2 taken 10 times.
10 b &= _TMockBackend::setLocalVar(p_mockManager, var->getComposeVar());
190 }
191 20 return b;
192 20 }
193
194 PAbstractConnector<_TBackend, _TMockBackend>* getConnector(const _TConnectorKey & name);
195 bool isConnectorExist(const _TConnectorKey & name) const;
196
197 private:
198 void initialisationPAbstractControlManager(ConnectorMode::ConnectorMode mode, const typename _TBackend::MgrParam & mgrParam, const typename _TMockBackend::Param & mockParam, const typename _TMockBackend::MgrParam & mockMgrParam);
199
200 ///Mode of the Connector (no mock, mock, mock_record)
201 ConnectorMode::ConnectorMode p_mode;
202 ///Parameters of the mock backend
203 typename _TMockBackend::Param p_mockParam;
204
205 ///Map of the connector to be used by the manager
206 std::map<_TConnectorKey, PAbstractConnector<_TBackend, _TMockBackend> *> p_mapConnector;
207 ///Map of internal variables (will be allocated by PAbstractConnectorManager)
208 std::map<std::string, PGenericInternalVar<_TBackend, _TMockBackend>* > p_mapInternalVar;
209
210 ///Data of the manager
211 typename _TBackend::Manager p_manager;
212 ///Data of the mock manager
213 typename _TMockBackend::Manager p_mockManager;
214 };
215
216 #include "PAbstractControlManager_impl.h"
217
218
219 #endif
220
221