Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/***************************************
Auteur : Pierre Aubert
Mail : pierre.aubert@lapp.in2p3.fr
Licence : CeCILL-C
****************************************/
#include <sstream>
#include "data_stream_check_value.h"
#include "PMockBackend.h"
///Default constructor of PMockBackend
PMockBackend::PMockBackend(){
}
///Create param for a client socket
/** @param address : address of the server to be connected to
* @param port : port to be used
* @param isMockRecord : true if the mock is in record mode
* @param mockDirectory : directory where to find/save mocks
* @return corresponding parameters
*/
PMockBackend::Param PMockBackend::client(const std::string & address, size_t port, bool isMockRecord, const std::string & mockDirectory){
PMockBackend::Param param;
param.address = address;
param.port = port;
param.isMockRecord = isMockRecord;
param.mockDirectory = mockDirectory;
return param;
}
///Create param for a server socket
/** @param address : address of the server to be connected to
* @param port : port to be used
* @param isMockRecord : true if the mock is in record mode
* @param mockDirectory : directory where to find/save mocks
* @return corresponding parameters
*/
PMockBackend::Param PMockBackend::server(const std::string & address, size_t port, bool isMockRecord, const std::string & mockDirectory){
return PMockBackend::client(address, port, isMockRecord, mockDirectory);
}
///Create a client socket
/** @param[out] socket : socket to be created
* @param param : extra customisable parameters for the creation of the socket (depends on the backend)
* @return true if the socket has been created, false otherwise
*/
bool PMockBackend::createClientSocket(PMockBackend::Socket & socket, const PMockParam & param){
socket.param = param;
socket.eventIndex = 0lu;
std::stringstream socketFileName;
if(param.mockDirectory != ""){
socketFileName << param.mockDirectory << "/";
}
socketFileName << param.address << "_" << param.port << ".pmockbackend";
socket.fileNameMessage = socketFileName.str();
bool b(true);
if(!socket.param.isMockRecord){ //If we are not in record mode, we load all the exchange
b &= data_load(socket.fileNameMessage, socket.vecMessage);
if(!b){
std::cerr << "PMockBackend::createClientSocket : cannot load file '"<<socket.fileNameMessage<<"'" << std::endl;
}
}
return b;
}
///Create a client socket
/** @param[out] socket : socket to be created
* @param param : extra customisable parameters for the creation of the socket (depends on the backend)
* @return true if the socket has been created, false otherwise
*/
bool PMockBackend::createServerSocket(PMockBackend::Socket & socket, const PMockParam & param){
return createClientSocket(socket, param);
}
///Send message on the given socket
/** @param socket : socket to be used
* @param msg : message to be sent
* @param flag : flag to be used to send the message (BLOCK, NON_BLOCK, etc)
bool PMockBackend::send(PMockBackend::Socket & socket, const PMockBackend::Message & msg, PSendFlag::PSendFlag flag){
bool b(true);
if(socket.param.isMockRecord){ //If we record all events
socket.vecMessage.push_back(msg);
}else{
if(socket.vecMessage.size() == 0lu){
std::cerr << "PMockBackend::send : empty vector of message" << std::endl;
return false;
}
//Let's pick the current message
if(socket.eventIndex >= socket.vecMessage.size()){
socket.eventIndex = 0lu; //Let's loop if all the events were used
}
//Let's check if the current message matches the message we are supposed to send
std::stringstream strEvent;
strEvent << socket.eventIndex;
b &= checkValue("PMockBackend::send : event " + strEvent.str(), msg, socket.vecMessage[socket.eventIndex]);
}
++socket.eventIndex;
return b;
}
///Recieve message from the given socket
/** @param socket : socket to be used
* @param msg : message to be recieved
* @param flag : flag to be used to send the message (BLOCK, NON_BLOCK, etc)
bool PMockBackend::recv(PMockBackend::Socket & socket, PMockBackend::Message & msg, PRecvFlag::PRecvFlag flag){
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
if(socket.param.isMockRecord){ //If we record all events
socket.vecMessage.push_back(msg);
}else{
if(socket.vecMessage.size() == 0lu){
std::cerr << "PMockBackend::recv : empty vector of message" << std::endl;
return false;
}
//Let's pick the current message
if(socket.eventIndex >= socket.vecMessage.size()){
socket.eventIndex = 0lu; //Let's loop if all the events were used
}
msg = socket.vecMessage[socket.eventIndex];
}
++socket.eventIndex;
return true;
}
///Resize a message
/** @param[out] msg : message to be resized
* @param sizeMsg : new size of the message
*/
void PMockBackend::msgResize(PMockBackend::Message& msg, size_t sizeMsg){
msg.resize(sizeMsg);
}
///Get the size of a message
/** @param msg : message to be used
* @return size of the message in bytes
*/
size_t PMockBackend::msgSize(const PMockBackend::Message& msg){
return msg.size();
}
///Get the data of a message
/** @param msg : message to be used
* @return data of the message in bytes
*/
const char* PMockBackend::msgData(const PMockBackend::Message& msg){
return msg.data();
}
///Get the data of a message
/** @param msg : message to be used
* @return data of the message in bytes
*/
char* PMockBackend::msgData(PMockBackend::Message& msg){
return msg.data();
}
///Close the given socket
/** @param[out] socket : socket to be closed
*/
void PMockBackend::close(PMockBackend::Socket & socket){
if(socket.param.isMockRecord){
data_save(socket.fileNameMessage, socket.vecMessage);
}
}
///Say if the given socket is connected
/** @param socket : socket to be checked
* @return true if the socket is connected, false otherwise
*/
bool PMockBackend::isConnected(const PMockBackend::Socket & socket){
return true;
}