67 std::ostringstream actual;
75 std::string
expected{
"0400000004000000030000000200000001\n"};
79 ack.prepend(buf,
false);
82 EXPECT_EQ(ack.resend_size(), 4U);
88 std::string expected2{
"0400000002000000040000000600000003\n"};
93 ack.prepend(buf2,
false);
95 EXPECT_EQ(actual.str(), expected2);
97 EXPECT_EQ(ack.resend_size(), 5U);
102 ack.prepend(buf3,
false);
106 std::string expected3{
"0400000002000000040000000300000006\n"};
107 EXPECT_EQ(actual.str(), expected3);
172 const Time::Duration end,
173 const Time::Duration step,
174 const Time::Duration end_sends,
176 const size_t wiresize,
177 const unsigned int reorder_prob,
178 const unsigned int drop_prob,
179 std::stringstream &case_detail)
184 std::deque<Message> wire;
196 for (t = Time::Duration(); t < end; t += step)
199 const Time now = base + t;
202 while (!acklist.empty())
209 case_detail << t.
raw() <<
" ACK [" <<
id <<
"]\n";
214 case_detail << t.raw() <<
" Simulate dropped ACK [" <<
id <<
"]\n";
223 ReliableSend::Message &m = send.
ref_by_id(i);
224 if (m.ready_retransmit(now))
232 m.reset_retransmit(now, Time::Duration());
242 if (send.
ready() && t < end_sends)
245 std::ostringstream
os;
246 os <<
"Test packet #" << count;
247 const std::string s =
os.str();
249 ReliableSend::Message &m = send.
send(now, Time::Duration());
250 m.packet.buf = buffer;
253 send_id =
msg.id = m.id();
261 if (!rand.
randrange(reorder_prob) && wire.size() >= 2)
263 const size_t i1 = rand.
randrange(wire.size());
264 const size_t i2 = rand.
randrange(wire.size());
267 case_detail << t.raw()
268 <<
" Simulate packet reordering "
269 << i1 <<
" <-> " << i2 <<
'\n';
270 std::swap(wire[i1], wire[i2]);
276 while (wire.size() >= wiresize || (!wire.empty() && !rand.
randrange(8)))
281 case_detail << t.raw() <<
" Received packet [" <<
msg.
id <<
"]\n";
289 acklist.push_back(
msg.id);
293 case_detail << t.raw()
294 <<
" Simulate dropped packet [" <<
msg.id <<
"]\n";
302 print_msg(t,
"RECV", m.packet.buf, m.id(), case_detail);
303 if (m.id() != rec_id)
304 throw receive_sequence();
311 case_detail <<
"Case Summary:\nrelsize=" << relsize
312 <<
" wiresize=" << wiresize
313 <<
" reorder=" << reorder_prob
314 <<
" drop=" << drop_prob
315 <<
" final_t=" << t.raw()
316 <<
" iterations=" << iterations
317 <<
" count=" << count
318 <<
" [" << send_id <<
'/' << (rec_id ? rec_id - 1 : 0) <<
"]\n";
319 if (send_id != (rec_id ? rec_id - 1 : 0))
320 throw receive_sequence();
335 std::vector<test_params> sim_cases = {
336 {.test_case = 1, .relsize = 4, .wiresize = 4, .reorder_prob = 10, .drop_prob = 16},
337 {.test_case = 2, .relsize = 2, .wiresize = 4, .reorder_prob = 10, .drop_prob = 16},
338 {.test_case = 3, .relsize = 4, .wiresize = 8, .reorder_prob = 10, .drop_prob = 16},
339 {.test_case = 4, .relsize = 4, .wiresize = 4, .reorder_prob = 2, .drop_prob = 2},
341 const Time::Duration end = Time::Duration::seconds(1000);
342 const Time::Duration step = Time::Duration::binary_ms(100);
343 const Time::Duration end_sends = end - Time::Duration::seconds(5);
344 for (
auto &sim_case : sim_cases)
347 std::stringstream case_detail;
350 case_detail <<
"Test case " << sim_case.test_case <<
'\n';
358 sim_case.reorder_prob,
362 catch (
const std::exception &e)
364 ASSERT_TRUE(
false) <<
"Exception: " << e.what() <<
"\nDetail:\n"
365 << case_detail.rdbuf();
void print_msg(const Time::Duration t, const char *title, BufferPtr &buf, const openvpn::PacketIDControl::id_t id, std::stringstream &case_detail)