GCC Code Coverage Report


Directory: ./
File: TESTS/TEST_PUSH_PULL/main.cpp
Date: 2026-01-23 17:10:06
Exec Total Coverage
Lines: 53 53 100.0%
Functions: 6 6 100.0%
Branches: 98 113 86.7%

Line Branch Exec Source
1 /***************************************
2 Auteur : Pierre Aubert
3 Mail : pierre.aubert@lapp.in2p3.fr
4 Licence : CeCILL-C
5 ****************************************/
6 ///The mock and real socket test for PUSH/PULL communication:
7 /**
8 * This test validates the PUSH/PULL communication using both mock and real sockets.
9 * It uses a socket manager to send and receive integer messages between two endpoints ("Alice" and "Bob").
10 *
11 * Configuration:
12 * - localhost:3390 is used as the communication port for both mock and real modes.
13 * - In mock mode, messages are serialized to mock files for validation.
14 *
15 * Workflow:
16 * 1. In mock mode:
17 * - Mock files are created to simulate socket communication.
18 * - The sender ("Alice") sends a sequence of integer messages.
19 * - The receiver ("Bob") reads the messages and checks their order and content.
20 * 2. In real mode:
21 * - Real sockets are used for communication.
22 * - Two threads are launched: one for sending and one for receiving messages.
23 * - The sender ("Alice") sends a sequence of integer messages.
24 * - The receiver ("Bob") reads the messages and checks their order and content.
25 *
26 * The test ensures that all sent messages are received in order and with correct values, both in mock and real socket modes.
27 *
28 * +-------------+ PUSH/PULL (INT) +-------------+
29 * | Alice |-------------------------------> | Bob |
30 * +-------------+ +-------------+
31 *
32 * In mock mode, the communication is validated via mock files.
33 * In real mode, the communication is validated via actual socket transmission.
34 */
35
36 #include <fstream>
37 #include <iostream>
38 #include <string>
39 #include <thread>
40 #include <unistd.h>
41
42 #include "data_stream_assert.h"
43 #include "PGenericSocketManager.h"
44 #include "PZmqBackend.h"
45
46 #define CONNECTION_PORT 3390lu
47
48 typedef PGenericSocketManager<std::string, PZmqBackend, PMockBackend> SocketManager;
49 typedef SocketManager::Backend Backend;
50 typedef SocketManager::Mock Mock;
51
52 ///Create mock message files (by using a mock socket in mock mode)
53 /** @param hostName : name of the host to be used
54 * @param port : port to be used
55 * @param prefix : prefix of the mock files
56 * @param nbMessage : number of messages to be created
57 */
58 1 void createMock(const std::string & hostName, size_t port, const std::string & prefix, size_t nbMessage){
59
1/1
✓ Branch 0 (2→3) taken 1 times.
1 PMockBackend::Socket mock;
60
7/10
✓ Branch 0 (5→6) taken 1 times.
✓ Branch 2 (8→9) taken 1 times.
✓ Branch 4 (11→12) taken 1 times.
✓ Branch 6 (12→13) taken 1 times.
✓ Branch 8 (13→14) taken 1 times.
✓ Branch 10 (14→15) taken 1 times.
✗ Branch 12 (16→17) not taken.
✓ Branch 13 (16→18) taken 1 times.
✗ Branch 14 (32→33) not taken.
✗ Branch 15 (32→34) not taken.
5 data_stream_assert(phoenix_createMockBackend(mock, PSocketParam{hostName, port}, prefix));
61
2/2
✓ Branch 0 (27→25) taken 10 times.
✓ Branch 1 (27→28) taken 1 times.
11 for(size_t i = 0lu; i < nbMessage; ++i){
62
1/1
✓ Branch 0 (25→26) taken 10 times.
10 mock.sendData(i);
63 }
64 1 }
65
66 ///Send messages on socket
67 /** @param[out] manager : socket manager to be used
68 * @param nbMessage : number of message to be sent
69 */
70 2 void threadSendMessage(SocketManager & manager, size_t nbMessage){
71 2 std::cout << "threadSendMessage : send mock message" << std::endl;
72
2/2
✓ Branch 0 (33→5) taken 20 times.
✓ Branch 1 (33→34) taken 2 times.
22 for(size_t i(0lu); i < nbMessage; ++i){
73
6/6
✓ Branch 0 (7→8) taken 20 times.
✓ Branch 2 (10→11) taken 20 times.
✓ Branch 4 (13→14) taken 20 times.
✓ Branch 6 (16→17) taken 20 times.
✓ Branch 8 (17→18) taken 20 times.
✓ Branch 10 (18→19) taken 20 times.
140 data_stream_assert(manager.sendData("Alice", i) == PSendStatus::OK);
74
5/5
✓ Branch 0 (27→28) taken 20 times.
✓ Branch 2 (28→29) taken 20 times.
✓ Branch 4 (29→30) taken 20 times.
✓ Branch 6 (30→31) taken 20 times.
✓ Branch 8 (31→32) taken 20 times.
20 std::cout << "message n°"<<i<<", Send value " << i << std::endl;
75 }
76 2 }
77
78 ///Receive messages on top of mock socket
79 /** @param[out] manager : socket manager to be used
80 * @param nbMessage : number of message to be read
81 */
82 2 void threadReceivedMessage(SocketManager & manager, size_t nbMessage){
83 2 std::cout << "threadReceivedMessage : read message to 'Bob'" << std::endl;
84 2 size_t i(0lu);
85
2/2
✓ Branch 0 (49→5) taken 20 times.
✓ Branch 1 (49→50) taken 2 times.
22 while(i < nbMessage){
86 20 size_t value(0lu);
87
6/6
✓ Branch 0 (7→8) taken 20 times.
✓ Branch 2 (10→11) taken 20 times.
✓ Branch 4 (13→14) taken 20 times.
✓ Branch 6 (16→17) taken 20 times.
✓ Branch 8 (17→18) taken 20 times.
✓ Branch 10 (18→19) taken 20 times.
140 data_stream_assert(manager.recvData("Bob", value) == PRecvStatus::OK);
88
5/5
✓ Branch 0 (27→28) taken 20 times.
✓ Branch 2 (28→29) taken 20 times.
✓ Branch 4 (29→30) taken 20 times.
✓ Branch 6 (30→31) taken 20 times.
✓ Branch 8 (31→32) taken 20 times.
20 std::cout << "Recv(0) message n°"<<i<<", value = " << value << std::endl;
89
4/4
✓ Branch 0 (34→35) taken 20 times.
✓ Branch 2 (37→38) taken 20 times.
✓ Branch 4 (40→41) taken 20 times.
✓ Branch 6 (41→42) taken 20 times.
100 data_stream_assert(value == i);
90 20 ++i;
91 }
92 2 }
93
94 ///Launch the process in mock mode
95 1 void testMockSocket(){
96 1 PSocketMode::PSocketMode mode = PSocketMode::MOCK;
97 1 size_t nbMessage(10lu), port(CONNECTION_PORT);
98
1/1
✓ Branch 0 (4→5) taken 1 times.
2 std::string hostName("localhost");
99
2/2
✓ Branch 0 (8→9) taken 1 times.
✓ Branch 2 (9→10) taken 1 times.
1 createMock(hostName, port, "./", nbMessage);
100
1/1
✓ Branch 0 (12→13) taken 1 times.
1 SocketManager manager(mode);
101
11/14
✓ Branch 0 (15→16) taken 1 times.
✓ Branch 2 (18→19) taken 1 times.
✓ Branch 4 (21→22) taken 1 times.
✓ Branch 6 (22→23) taken 1 times.
✓ Branch 8 (25→26) taken 1 times.
✓ Branch 10 (26→27) taken 1 times.
✓ Branch 12 (27→28) taken 1 times.
✓ Branch 14 (30→31) taken 1 times.
✓ Branch 16 (31→32) taken 1 times.
✓ Branch 18 (32→33) taken 1 times.
✗ Branch 20 (36→37) not taken.
✓ Branch 21 (36→38) taken 1 times.
✗ Branch 22 (101→102) not taken.
✗ Branch 23 (101→103) not taken.
10 data_stream_assert(manager.addServerSocket("Alice", PSocketParam{hostName, port}, Backend::server(), "./", Mock::server()));
102
11/14
✓ Branch 0 (48→49) taken 1 times.
✓ Branch 2 (51→52) taken 1 times.
✓ Branch 4 (54→55) taken 1 times.
✓ Branch 6 (55→56) taken 1 times.
✓ Branch 8 (58→59) taken 1 times.
✓ Branch 10 (59→60) taken 1 times.
✓ Branch 12 (60→61) taken 1 times.
✓ Branch 14 (63→64) taken 1 times.
✓ Branch 16 (64→65) taken 1 times.
✓ Branch 18 (65→66) taken 1 times.
✗ Branch 20 (69→70) not taken.
✓ Branch 21 (69→71) taken 1 times.
✗ Branch 22 (139→140) not taken.
✗ Branch 23 (139→141) not taken.
9 data_stream_assert(manager.addClientSocket("Bob", PSocketParam{hostName, port}, Backend::client(), "./", Mock::client()));
103
1/1
✓ Branch 0 (79→80) taken 1 times.
1 threadSendMessage(manager, nbMessage);
104
1/1
✓ Branch 0 (80→81) taken 1 times.
1 threadReceivedMessage(manager, nbMessage);
105 1 }
106
107 ///Launch the process in real mode
108 1 void testRealSocket(){
109 1 PSocketMode::PSocketMode mode = PSocketMode::NO_MOCK;
110 1 size_t nbMessage(10lu), port(CONNECTION_PORT);
111
1/1
✓ Branch 0 (4→5) taken 1 times.
1 std::string hostName("localhost");
112
1/1
✓ Branch 0 (6→7) taken 1 times.
1 SocketManager manager(mode);
113
11/14
✓ Branch 0 (9→10) taken 1 times.
✓ Branch 2 (12→13) taken 1 times.
✓ Branch 4 (15→16) taken 1 times.
✓ Branch 6 (16→17) taken 1 times.
✓ Branch 8 (19→20) taken 1 times.
✓ Branch 10 (20→21) taken 1 times.
✓ Branch 12 (21→22) taken 1 times.
✓ Branch 14 (24→25) taken 1 times.
✓ Branch 16 (25→26) taken 1 times.
✓ Branch 18 (26→27) taken 1 times.
✗ Branch 20 (30→31) not taken.
✓ Branch 21 (30→32) taken 1 times.
✗ Branch 22 (104→105) not taken.
✗ Branch 23 (104→106) not taken.
10 data_stream_assert(manager.addServerSocket("Alice", PSocketParam{hostName, port}, Backend::server(), "./", Mock::server()));
114
11/14
✓ Branch 0 (42→43) taken 1 times.
✓ Branch 2 (45→46) taken 1 times.
✓ Branch 4 (48→49) taken 1 times.
✓ Branch 6 (49→50) taken 1 times.
✓ Branch 8 (52→53) taken 1 times.
✓ Branch 10 (53→54) taken 1 times.
✓ Branch 12 (54→55) taken 1 times.
✓ Branch 14 (57→58) taken 1 times.
✓ Branch 16 (58→59) taken 1 times.
✓ Branch 18 (59→60) taken 1 times.
✗ Branch 20 (63→64) not taken.
✓ Branch 21 (63→65) taken 1 times.
✗ Branch 22 (142→143) not taken.
✗ Branch 23 (142→144) not taken.
9 data_stream_assert(manager.addClientSocket("Bob", PSocketParam{hostName, port}, Backend::client(), "./", Mock::client()));
115 1 std::vector<std::thread> vecThread;
116
1/1
✓ Branch 0 (74→75) taken 1 times.
1 vecThread.resize(2lu);
117
1/1
✓ Branch 0 (76→77) taken 1 times.
1 vecThread[0] = std::thread(threadReceivedMessage, std::ref(manager), nbMessage);
118
1/1
✓ Branch 0 (81→82) taken 1 times.
1 vecThread[1] = std::thread(threadSendMessage, std::ref(manager), nbMessage);
119
120
1/1
✓ Branch 0 (86→87) taken 1 times.
1 vecThread[1].join();
121
1/1
✓ Branch 0 (88→89) taken 1 times.
1 vecThread[0].join();
122 1 }
123
124 1 int main(int argc, char **argv){
125 1 testMockSocket();
126 1 std::cout << "----------------------------------" << std::endl;
127 1 std::cout << "Now test with real socket" << std::endl;
128 1 testRealSocket();
129 1 return 0;
130 }
131