Branch data Line data Source code
1 : : /* Copyright 2006-2011 Savarese Software Research Corporation
2 : : *
3 : : * Licensed under the Apache License, Version 2.0 (the "License");
4 : : * you may not use this file except in compliance with the License.
5 : : * You may obtain a copy of the License at
6 : : *
7 : : * http://www.savarese.com/software/ApacheLicense-2.0
8 : : *
9 : : * Unless required by applicable law or agreed to in writing, software
10 : : * distributed under the License is distributed on an "AS IS" BASIS,
11 : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : : * See the License for the specific language governing permissions and
13 : : * limitations under the License.
14 : : */
15 : :
16 : : #include <ssrc/wisp/utility/TimeValue.h>
17 : : #include <ssrc/wisp/protocol/Caller.h>
18 : :
19 : : #define BOOST_TEST_MODULE CallerTest
20 : : #include <boost/test/unit_test.hpp>
21 : :
22 : : using namespace NS_SSRC_WISP;
23 : : using namespace NS_SSRC_WISP_PROTOCOL;
24 : : using NS_SSRC_WISP_UTILITY::TimeValue;
25 : : using ssrc::spread::Message;
26 : :
27 : : #define MBOX WISP_SPREAD_DAEMON
28 : :
29 : : enum ProtocolNumber { ProtoTest = 1776 };
30 : :
31 : 38 : WISP_DEFINE_PROTOCOL(ProtoTest);
32 : :
33 : : struct InitTest {
34 : 1 : InitTest() {
35 : 1 : std::srand(TimeValue::now_seconds());
36 : 1 : }
37 : : };
38 : :
39 : 1 : BOOST_GLOBAL_FIXTURE(InitTest)
40 : :
41 : : struct TestProtocol : public ServiceProtocol<ProtoTest> {
42 : : enum MessageType {
43 : : Stop, EchoRequest, EchoReply, SendString, RequestBigPacket, ReturnBigPacket
44 : : };
45 : :
46 : : typedef MessageProtoTest<Stop> MessageStop;
47 : : typedef MessageProtoTest<EchoRequest> MessageEchoRequest;
48 : : typedef MessageProtoTest<EchoReply> MessageEchoReply;
49 : :
50 : 10 : WISP_PROTOCOL_MESSAGE(SendString, MessageProtoTest, ((string, str)));
51 : :
52 : : typedef MessageProtoTest<RequestBigPacket> MessageRequestBigPacket;
53 : :
54 : : WISP_PROTOCOL_MESSAGE_WITH_INIT(ReturnBigPacket, MessageProtoTest,
55 : : ((ByteBuffer, payload)),
56 : 15 : (ByteBuffer(0)));
57 : :
58 : : WISP_ONE_WAY_CALL(caller_type, Stop);
59 : : WISP_ONE_WAY_CALL(caller_type, EchoReply);
60 : : WISP_TWO_WAY_CALL(caller_type, EchoRequest, EchoReply);
61 : : WISP_ONE_WAY_CALL(caller_type, SendString);
62 : : WISP_ONE_WAY_CALL(caller_type, ReturnBigPacket);
63 : : WISP_TWO_WAY_CALL(caller_type, RequestBigPacket, ReturnBigPacket);
64 : : };
65 : :
66 : : const unsigned int JumboCapacity = 1048832;
67 : : const unsigned int JumboPayloadSize = 1048576;
68 : :
69 : : WISP_IMPORT(TestProtocol, MessageStop);
70 : : WISP_IMPORT(TestProtocol, MessageEchoRequest);
71 : : WISP_IMPORT(TestProtocol, MessageEchoReply);
72 : : WISP_IMPORT(TestProtocol, MessageSendString);
73 : : WISP_IMPORT(TestProtocol, CallStop);
74 : : WISP_IMPORT(TestProtocol, CallEchoRequest);
75 : : WISP_IMPORT(TestProtocol, CallEchoReply);
76 : : WISP_IMPORT(TestProtocol, CallSendString);
77 : :
78 : : WISP_IMPORT(TestProtocol, MessageReturnBigPacket);
79 : : WISP_IMPORT(TestProtocol, CallRequestBigPacket);
80 : : WISP_IMPORT(TestProtocol, CallReturnBigPacket);
81 : :
82 [ + - ][ + - ]: 2 : BOOST_AUTO_TEST_CASE(test_receive) {
83 [ + - ][ + - ]: 2 : Caller<> call(MBOX, "", Message::DefaultCapacity, true);
[ + - ][ + - ]
[ + - ]
84 : :
85 : : CallEchoRequest::future_ptr future_echo =
86 [ + - ][ + - ]: 2 : call(CallEchoRequest(), call.name(), Message::Safe);
87 : :
88 [ + - ][ + - ]: 2 : message_info_ptr info;
89 [ + - ]: 1 : call.receive(info);
90 : :
91 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
92 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->role() == TwoWayRequest);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
93 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->token() == future_echo->token());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
94 : :
95 [ + - ]: 1 : call(CallEchoReply(), call.name(), future_echo->token(), Message::Safe);
96 : :
97 [ + - ]: 1 : call.receive(info);
98 : :
99 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoReply::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
100 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->role() == TwoWayResponse);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
101 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->token() == future_echo->token());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
102 : :
103 : : MessageEchoReply msg_reply;
104 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(future_echo->unpack(msg_reply, *info));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
105 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_echo->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
106 : 1 : }
107 : :
108 [ + - ][ + - ]: 2 : BOOST_AUTO_TEST_CASE(test_future) {
109 [ + - ][ + - ]: 2 : Caller<> call(MBOX, "", Message::DefaultCapacity, true);
[ + - ][ + - ]
[ + - ]
110 : :
111 : : CallEchoRequest::future_ptr future_echo1 =
112 [ + - ][ + - ]: 2 : call(CallEchoRequest(), call.name(), Message::Safe);
113 [ + - ]: 1 : call(CallEchoReply(), call.name(), future_echo1->token(), Message::Safe);
114 : :
115 [ + - ][ + - ]: 1 : call(CallStop(), call.name(), Message::Safe);
116 : :
117 : : CallEchoRequest::future_ptr future_echo3 =
118 [ + - ][ + - ]: 2 : call(CallEchoRequest(), call.name(), Message::Safe);
119 : :
120 [ + - ][ + - ]: 1 : call(CallStop(), call.name(), Message::Safe);
121 : :
122 [ + - ]: 1 : call.send<CallSendString>(Message::Safe, call.name(), "bar");
123 [ + - ]: 1 : call.send<CallSendString>(Message::Safe, call.name(), "foo");
124 : :
125 [ + - ][ + - ]: 1 : call.join("foo");
[ + - ]
126 : :
127 [ + - ]: 1 : call(CallEchoReply(), call.name(), future_echo3->token(), Message::Safe);
128 : :
129 [ + - ][ + - ]: 2 : message_info_ptr info;
130 [ + - ]: 1 : call.receive_request(info);
131 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
132 [ + - ]: 1 : call.receive_request(info);
133 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageStop::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
134 : :
135 [ + - ][ + - ]: 1 : call(CallStop(), call.name(), Message::Safe);
136 : :
137 : : CallEchoRequest::future_ptr future_echo2 =
138 [ + - ][ + - ]: 2 : call(CallEchoRequest(), call.name(), Message::Safe);
139 : :
140 [ + - ][ + - ]: 1 : call.leave("foo");
[ + - ]
141 : :
142 [ + - ]: 1 : call(CallEchoReply(), call.name(), future_echo2->token(), Message::Safe);
143 : :
144 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_echo2->ready());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
145 [ + - ][ + - ]: 1 : BOOST_REQUIRE(future_echo2->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
146 : :
147 : : MessageEchoReply msg_reply;
148 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(future_echo1->receive(msg_reply));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
149 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_echo1->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
150 : :
151 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(future_echo2->receive(msg_reply));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
152 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_echo2->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
153 : :
154 [ + - ]: 1 : call.receive_request(info);
155 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
156 : :
157 [ + - ]: 1 : call.receive_request(info);
158 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageStop::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
159 : :
160 [ + - ][ + - ]: 2 : MessageSendString msg_send_str;
161 [ + - ]: 1 : call.receive_request(info);
162 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageSendString::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
163 [ + - ]: 1 : call.unpack(msg_send_str, *info);
164 [ + - ][ + - ]: 1 : BOOST_REQUIRE("bar" == msg_send_str.str);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
165 : :
166 [ + - ][ + - ]: 1 : BOOST_REQUIRE(future_echo3->ready());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
167 [ + - ][ + - ]: 1 : BOOST_REQUIRE(future_echo3->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
168 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(future_echo3->receive(msg_reply));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
169 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_echo3->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
170 : :
171 [ + - ]: 1 : call.receive_request(info);
172 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageSendString::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
173 [ + - ]: 1 : call.unpack(msg_send_str, *info);
174 [ + - ][ + - ]: 1 : BOOST_REQUIRE("foo" == msg_send_str.str);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
175 : :
176 [ + - ]: 1 : call.receive_request(info);
177 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->message.is_membership());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
178 : :
179 [ + - ]: 1 : call.receive_request(info);
180 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageStop::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
181 : :
182 [ + - ]: 1 : call.receive_request(info);
183 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
184 : :
185 [ + - ]: 1 : call.receive_request(info);
186 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->message.is_membership());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
187 : 1 : }
188 : :
189 [ + - ][ + - ]: 2 : BOOST_AUTO_TEST_CASE(test_receive_jumbo_response) {
190 [ + - ][ + - ]: 2 : Caller<> call(MBOX, "", JumboCapacity, true);
[ + - ][ + - ]
[ + - ]
191 : :
192 : : CallRequestBigPacket::future_ptr future_packet =
193 [ + - ][ + - ]: 2 : call(CallRequestBigPacket(), call.name(), Message::Safe);
194 : :
195 : : CallEchoRequest::future_ptr future_echo =
196 [ + - ][ + - ]: 2 : call(CallEchoRequest(), call.name(), Message::Safe);
197 : :
198 [ + - ][ + - ]: 2 : message_info_ptr info;
199 [ + - ]: 1 : call.receive(info);
200 : :
201 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == CallRequestBigPacket::parameter_type::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
202 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->role() == TwoWayRequest);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
203 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->token() == future_packet->token());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
204 : :
205 [ + - ][ + - ]: 2 : MessageReturnBigPacket packet_msg;
[ + - ][ + - ]
206 : :
207 [ + - ]: 1 : packet_msg.payload.resize(JumboPayloadSize);
208 [ + + ]: 262145 : while(packet_msg.payload.offset() < JumboPayloadSize) {
209 : 262144 : int bytes = std::rand();
210 [ + - ]: 262144 : packet_msg.payload.write(&bytes, sizeof(bytes));
211 : : }
212 : :
213 : 1 : call.reply<CallReturnBigPacket>(info->sender(), info->token(), packet_msg,
214 [ + - ]: 2 : Message::Safe);
215 [ + - ]: 1 : call.receive(info);
216 : :
217 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
218 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->role() == TwoWayRequest);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
219 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->token() == future_echo->token());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
220 : :
221 [ + - ]: 1 : call(CallEchoReply(), call.name(), info->token(), Message::Safe);
222 [ + - ]: 1 : info.reset();
223 : :
224 : : MessageEchoReply echo_reply;
225 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(future_echo->receive(echo_reply));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
226 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_echo->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
227 : :
228 [ + - ][ + - ]: 2 : MessageReturnBigPacket packet_reply;
[ + - ][ + - ]
229 : :
230 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(future_packet->receive(packet_reply));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
231 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_packet->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
232 : :
233 [ + - ][ + - ]: 1 : BOOST_REQUIRE_EQUAL(packet_reply.payload.size(), packet_msg.payload.size());
[ + - ][ + - ]
[ + - ][ - + ]
234 [ + - ]: 3 : BOOST_REQUIRE_EQUAL(std::memcmp(&packet_msg.payload[0],
[ + - + - ]
[ - + ]
235 : : &packet_reply.payload[0],
236 [ + - ][ + - ]: 2 : packet_msg.payload.size()), 0);
237 : 1 : }
238 : :
239 [ + - ][ + - ]: 2 : BOOST_AUTO_TEST_CASE(test_receive_jumbo_request) {
240 [ + - ][ + - ]: 2 : Caller<> call(MBOX, "", JumboCapacity, true);
[ + - ][ + - ]
[ + - ]
241 : :
242 : : CallEchoRequest::future_ptr future_echo =
243 [ + - ][ + - ]: 2 : call(CallEchoRequest(), call.name(), Message::Safe);
244 : :
245 [ + - ][ + - ]: 2 : MessageReturnBigPacket packet_msg;
[ + - ][ + - ]
246 : :
247 [ + - ]: 1 : packet_msg.payload.resize(JumboPayloadSize);
248 [ + + ]: 262145 : while(packet_msg.payload.offset() < JumboPayloadSize) {
249 : 262144 : int bytes = std::rand();
250 [ + - ]: 262144 : packet_msg.payload.write(&bytes, sizeof(bytes));
251 : : }
252 : :
253 [ + - ]: 1 : call.send<CallReturnBigPacket>(call.name(), packet_msg, Message::Safe);
254 : :
255 [ + - ][ + - ]: 2 : message_info_ptr info;
256 [ + - ]: 1 : call.receive_request(info);
257 : :
258 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
259 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->role() == TwoWayRequest);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
260 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->token() == future_echo->token());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
261 : :
262 [ + - ]: 1 : call(CallEchoReply(), call.name(), info->token(), Message::Safe);
263 [ + - ]: 1 : info.reset();
264 : :
265 : : MessageEchoReply echo_reply;
266 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(future_echo->receive(echo_reply));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
267 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_echo->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
268 : :
269 [ + - ]: 1 : call.receive_request(info);
270 : :
271 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->header.message_size > packet_msg.payload.size());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
272 : :
273 : : const unsigned int header_size =
274 : 1 : info->header.message_size - packet_msg.payload.size();
275 : :
276 [ + - ]: 3 : BOOST_REQUIRE_EQUAL(std::memcmp(&packet_msg.payload[0],
[ + - + - ]
[ - + ]
277 : : &info->message[header_size],
278 [ + - ][ + - ]: 2 : packet_msg.payload.size()), 0);
279 : 1 : }
280 : :
281 [ + - ][ + - ]: 2 : BOOST_AUTO_TEST_CASE(test_receive_jumbo) {
282 [ + - ][ + - ]: 2 : Caller<> call(MBOX, "", JumboCapacity, true);
[ + - ][ + - ]
[ + - ]
283 : :
284 : : CallEchoRequest::future_ptr future_echo =
285 [ + - ][ + - ]: 2 : call(CallEchoRequest(), call.name(), Message::Safe);
286 : :
287 [ + - ][ + - ]: 2 : MessageReturnBigPacket packet_msg;
[ + - ][ + - ]
288 : :
289 [ + - ]: 1 : packet_msg.payload.resize(JumboPayloadSize);
290 [ + + ]: 262145 : while(packet_msg.payload.offset() < JumboPayloadSize) {
291 : 262144 : int bytes = std::rand();
292 [ + - ]: 262144 : packet_msg.payload.write(&bytes, sizeof(bytes));
293 : : }
294 : :
295 [ + - ]: 1 : call.send<CallReturnBigPacket>(call.name(), packet_msg, Message::Safe);
296 : :
297 [ + - ][ + - ]: 2 : message_info_ptr info;
298 [ + - ]: 1 : call.receive(info);
299 : :
300 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
301 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->role() == TwoWayRequest);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
302 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->token() == future_echo->token());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
303 : :
304 [ + - ]: 1 : call(CallEchoReply(), call.name(), info->token(), Message::Safe);
305 : :
306 : : MessageEchoReply echo_reply;
307 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(future_echo->receive(echo_reply));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
308 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_echo->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
309 : :
310 [ + - ]: 1 : call.receive(info);
311 : :
312 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->header.message_size > packet_msg.payload.size());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
313 : :
314 : : const unsigned int header_size =
315 : 1 : info->header.message_size - packet_msg.payload.size();
316 : :
317 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->groups[0] == call.name());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
318 [ + - ]: 3 : BOOST_REQUIRE_EQUAL(std::memcmp(&packet_msg.payload[0],
[ + - + - ]
[ - + ]
319 : : &info->message[header_size],
320 [ + - ][ + - ]: 2 : packet_msg.payload.size()), 0);
321 : :
322 [ + - ][ + - ]: 2 : MessageReturnBigPacket packet_recv;
[ + - ][ + - ]
323 : :
324 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(call.unpacker().unpack(packet_recv,info->message));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
325 [ + - ][ + - ]: 1 : BOOST_REQUIRE_EQUAL(packet_recv.payload.size(), packet_msg.payload.size());
[ + - ][ + - ]
[ + - ][ - + ]
326 [ + - ]: 3 : BOOST_REQUIRE_EQUAL(std::memcmp(&packet_msg.payload[0],
[ + - + - ]
[ - + ]
327 : : &packet_recv.payload[0],
328 [ + - ][ + - ]: 2 : packet_msg.payload.size()), 0);
329 : 1 : }
330 : :
331 [ + - ][ + - ]: 2 : BOOST_AUTO_TEST_CASE(test_erase_jumbo_messages) {
332 : 1 : const unsigned int message_size = Caller<>::MaxUnfragmentedMessageSize;
333 [ + - ][ + - ]: 2 : Caller<> call(MBOX, "", message_size, true);
[ + - ][ + - ]
[ + - ]
334 : :
335 : : CallRequestBigPacket::future_ptr future_packet =
336 [ + - ][ + - ]: 2 : call(CallRequestBigPacket(), call.name(), Message::Safe);
337 : :
338 : : CallEchoRequest::future_ptr future_echo =
339 [ + - ][ + - ]: 2 : call(CallEchoRequest(), call.name(), Message::Safe);
340 : :
341 [ + - ][ + - ]: 2 : message_info_ptr info;
342 [ + - ]: 1 : call.receive(info);
343 : :
344 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == CallRequestBigPacket::parameter_type::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
345 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->role() == TwoWayRequest);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
346 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->token() == future_packet->token());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
347 : :
348 : 1 : CallHeader header(MessageReturnBigPacket::id,info->token(),TwoWayResponse);
349 [ + - ][ + - ]: 2 : Message message(message_size + 1024);
350 : :
351 [ + - ]: 1 : call.packer().pack(header, message);
352 : :
353 [ + + ]: 33021 : while(message.offset() < message_size + 1024) {
354 : 33020 : int bytes = std::rand();
355 [ + - ]: 33020 : message.write(&bytes, sizeof(bytes));
356 : : }
357 : :
358 [ + - ]: 1 : header.message_size = message.size();
359 [ + - ]: 1 : message.rewind();
360 : :
361 [ + - ]: 1 : call.packer().pack(header, message);
362 : :
363 [ + - ]: 1 : message.resize(message_size);
364 : : // Cheat so we can send
365 : 1 : ssrc::spread::Mailbox *mbox = &const_cast<Mailbox &>(call.mbox());
366 [ + - ]: 1 : mbox->send(message, call.name());
367 : :
368 [ + - ]: 1 : call.receive(info);
369 : :
370 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
371 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->role() == TwoWayRequest);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
372 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->token() == future_echo->token());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
373 : :
374 [ + - ]: 1 : call(CallEchoReply(), call.name(), info->token(), Message::Safe);
375 [ + - ]: 1 : info.reset();
376 : :
377 : : MessageEchoReply echo_reply;
378 [ + - ][ + - ]: 1 : BOOST_REQUIRE_NO_THROW(future_echo->receive(echo_reply));
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
379 [ + - ][ + - ]: 1 : BOOST_REQUIRE(!future_echo->valid());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
380 : :
381 [ + - ][ + - ]: 1 : future_echo = call(CallEchoRequest(), call.name(), Message::Safe);
[ + - ]
382 : :
383 [ + - ][ + - ]: 2 : std::vector<Caller<>::jumbo_message_key_type> keys;
384 : :
385 [ + - ][ + - ]: 1 : BOOST_REQUIRE_EQUAL(static_cast<unsigned int>(keys.size()), 0u);
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
386 [ + - ][ + - ]: 1 : BOOST_REQUIRE_EQUAL(call.count_jumbo_messages(), 1u);
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
387 : :
388 [ + - ]: 1 : call.collect_jumbo_message_keys(keys);
389 : :
390 [ + - ][ + - ]: 1 : BOOST_REQUIRE_EQUAL(static_cast<unsigned int>(keys.size()), 1u);
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
391 : :
392 [ + - ][ + - ]: 1 : call.erase_jumbo_messages(keys.begin(), keys.end());
[ + - ]
393 : :
394 [ + - ][ + - ]: 1 : BOOST_REQUIRE_EQUAL(call.count_jumbo_messages(), 0u);
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
395 : :
396 [ + - ][ + - ]: 1 : call.erase_jumbo_messages(keys.begin(), keys.end());
[ + - ]
397 : :
398 [ + - ][ + - ]: 1 : BOOST_REQUIRE_EQUAL(call.count_jumbo_messages(), 0u);
[ + - ][ + - ]
[ + - ][ + - ]
[ - + ]
399 : :
400 [ + - ]: 1 : call.receive(info);
401 : :
402 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->id() == MessageEchoRequest::id);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
403 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->role() == TwoWayRequest);
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
404 [ + - ][ + - ]: 1 : BOOST_REQUIRE(info->token() == future_echo->token());
[ + - ][ + - ]
[ + - ][ + - ]
[ + - ][ - + ]
405 [ + - ][ + - ]: 6 : }
[ + - ][ + - ]
|