48TEST(unwrap_sequence_id, null)
50 auto full_sequence_id = unwrap_sequence_id(0, -1, 0);
52 EXPECT_EQ(full_sequence_id, 0);
54 full_sequence_id = unwrap_sequence_id(0, 0, 0);
56 EXPECT_EQ(full_sequence_id, 0);
59TEST(unwrap_sequence_id, no_increment)
61 const auto full_sequence_id = unwrap_sequence_id(1, 1, 0);
63 EXPECT_EQ(full_sequence_id, 0);
66TEST(unwrap_sequence_id, increment)
68 const auto full_sequence_id = unwrap_sequence_id(1, 0, 0);
70 EXPECT_EQ(full_sequence_id, 1);
73TEST(unwrap_sequence_id, rollover)
75 const auto full_sequence_id = unwrap_sequence_id(0, 65535, 0);
77 EXPECT_EQ(full_sequence_id, 1);
80TEST(unwrap_sequence_id, rollover_unique)
82 const auto full_sequence_id = unwrap_sequence_id(0, 65535, 123456);
84 EXPECT_EQ(full_sequence_id, 123457);
125TEST(get_full_message_size, valid)
131 const auto serialized = serialize(info, 10, 9000);
133 const auto full_size = get_full_message_size(serialized);
135 ASSERT_TRUE(
static_cast<bool>(full_size));
137 ASSERT_GT(full_size.value(), 20);
138 ASSERT_LT(full_size.value(), 200);
141TEST(serialize_deserialize, roundtrip)
147 info.numberOfPcbs = 0;
148 info.motorName =
"bar";
150 auto serialized = serialize(info, 10, 9000);
155 serialized.erase(std::begin(serialized), std::begin(serialized) +
sizeof(wire::Header));
158 const auto round_trip = deserialize<wire::SysDeviceInfo>(serialized);
160 ASSERT_EQ(round_trip.name, info.name);
161 ASSERT_EQ(round_trip.numberOfPcbs, info.numberOfPcbs);
162 ASSERT_EQ(round_trip.motorName, info.motorName);
165TEST(MessageAssembler, process_notify_wait_for)
168 using namespace std::chrono_literals;
172 auto serialized = serialize(info, 10, 9000);
174 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{10, 9000, 2, 100000})};
175 auto registration = assembler.register_message(wire::SysDeviceInfo::ID);
176 ASSERT_TRUE(assembler.process_packet(serialized));
180 ASSERT_TRUE(
static_cast<bool>(output));
182 ASSERT_EQ(output->name, info.name);
186TEST(MessageAssembler, process_notify_wait)
189 using namespace std::chrono_literals;
192 info.
name =
"test_wait";
193 auto serialized = serialize(info, 10, 9000);
195 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{10, 9000, 2, 100000})};
196 auto registration = assembler.register_message(wire::SysDeviceInfo::ID);
197 ASSERT_TRUE(assembler.process_packet(serialized));
201 ASSERT_TRUE(
static_cast<bool>(output));
203 ASSERT_EQ(output->name, info.name);
206TEST(MessageAssembler, process_notify_wait_for_multi_registrations)
209 using namespace std::chrono_literals;
213 auto serialized = serialize(info, 10, 9000);
215 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{10, 9000, 2, 100000})};
216 auto registration0 = assembler.register_message(wire::SysDeviceInfo::ID);
217 auto registration1 = assembler.register_message(wire::SysDeviceInfo::ID);
218 ASSERT_TRUE(assembler.process_packet(serialized));
223 ASSERT_TRUE(
static_cast<bool>(output0));
224 ASSERT_TRUE(
static_cast<bool>(output1));
226 ASSERT_EQ(output0->name, info.name);
227 ASSERT_EQ(output1->
name, info.name);
230TEST(MessageAssembler, process_notify_remove_registration)
233 using namespace std::chrono_literals;
237 auto serialized = serialize(info, 10, 9000);
239 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{10, 9000, 2, 100000})};
240 auto registration = assembler.register_message(wire::SysDeviceInfo::ID);
241 assembler.remove_registration(wire::SysDeviceInfo::ID);
242 ASSERT_TRUE(assembler.process_packet(serialized));
249 ASSERT_FALSE(
static_cast<bool>(output));
252TEST(MessageAssembler, process_callback)
255 using namespace std::chrono_literals;
258 info.
name =
"test_callback";
259 auto serialized = serialize(info, 10, 9000);
265 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{10, 9000, 2, 100000})};
266 assembler.register_callback(wire::SysDeviceInfo::ID,
267 [&output](
const auto &data)
269 output = deserialize<wire::SysDeviceInfo>(*data);
271 ASSERT_TRUE(assembler.process_packet(serialized));
273 ASSERT_EQ(output.
name, info.name);
278 assembler.remove_callback(wire::SysDeviceInfo::ID);
280 info.name =
"test_callback_new";
281 serialized = serialize(info, 11, 9000);
282 ASSERT_TRUE(assembler.process_packet(serialized));
284 ASSERT_NE(output.
name, info.name);
287TEST(MessageAssembler, use_all_buffers)
290 using namespace std::chrono_literals;
293 info.
name =
"test_callback";
294 auto serialized = serialize(info, 10, 9000);
299 std::vector<std::shared_ptr<const std::vector<uint8_t>>> outputs;
300 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{2, 9000, 1, 100000})};
301 assembler.register_callback(wire::SysDeviceInfo::ID,
302 [&outputs](
const auto data)
304 outputs.push_back(data);
306 ASSERT_TRUE(assembler.process_packet(serialized));
307 ASSERT_TRUE(assembler.process_packet(serialized));
312 ASSERT_FALSE(assembler.process_packet(serialized));
315TEST(MessageAssembler, invalid_message)
318 using namespace std::chrono_literals;
321 info.
name =
"test_callback";
322 auto serialized = serialize(info, 10, 9000);
329 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{2, 9000, 1, 100000})};
334 ASSERT_FALSE(assembler.process_packet(serialized));
335 ASSERT_FALSE(assembler.process_packet(std::vector<uint8_t>{}));
338TEST(MessageAssembler, only_large_buffers)
341 using namespace std::chrono_literals;
344 info.
name =
"test_callback";
345 auto serialized = serialize(info, 10, 9000);
347 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{1, 1, 1, 100000})};
348 auto registration = assembler.register_message(wire::SysDeviceInfo::ID);
350 ASSERT_TRUE(assembler.process_packet(serialized));
354 ASSERT_TRUE(
static_cast<bool>(output));
356 ASSERT_EQ(output->name, info.name);
359TEST(MessageAssembler, multi_large_packets)
362 using namespace std::chrono_literals;
365 info.
name =
"test_callback";
366 auto serialized = serialize(info, 0, 9000);
371 auto sequence_id =
reinterpret_cast<uint16_t*
>(&serialized[8]);
372 auto message_length =
reinterpret_cast<uint32_t*
>(&serialized[10]);
373 *message_length = 10000;
375 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{1, 1, 1, 100000})};
376 auto registration = assembler.register_message(wire::SysDeviceInfo::ID);
383 for (
size_t i = 1 ; i < 100 ; ++i)
385 ASSERT_TRUE(assembler.process_packet(serialized));
388 ASSERT_FALSE(
static_cast<bool>(output));
395TEST(MessageAssembler, stats_valid_message)
398 using namespace std::chrono_literals;
401 info.
name =
"test_callback";
402 auto serialized = serialize(info, 10, 9000);
404 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{2, 9000, 1, 100000})};
406 ASSERT_TRUE(assembler.process_packet(serialized));
408 const auto stats = assembler.get_message_statistics();
410 ASSERT_EQ(stats.received_messages, 1);
411 ASSERT_EQ(stats.dropped_messages, 0);
412 ASSERT_EQ(stats.invalid_packets, 0);
415TEST(MessageAssembler, stats_invalid_message)
418 using namespace std::chrono_literals;
421 info.
name =
"test_callback";
422 auto serialized = serialize(info, 10, 9000);
429 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{2, 9000, 1, 100000})};
434 ASSERT_FALSE(assembler.process_packet(serialized));
435 ASSERT_FALSE(assembler.process_packet(std::vector<uint8_t>{}));
437 const auto stats = assembler.get_message_statistics();
439 ASSERT_EQ(stats.received_messages, 0);
440 ASSERT_EQ(stats.dropped_messages, 0);
441 ASSERT_EQ(stats.invalid_packets, 2);
444TEST(MessageAssembler, stats_dropped_valid_message)
447 using namespace std::chrono_literals;
450 info.
name =
"test_callback";
451 auto serialized = serialize(info, 10, 9000);
453 MessageAssembler assembler{std::make_shared<BufferPool>(BufferPoolConfig{2, 9000, 1, 100000})};
458 ASSERT_TRUE(assembler.process_packet(serialized));
460 serialized = serialize(info, 11, 9000);
461 wire::Header& header = *(
reinterpret_cast<wire::Header*
>(serialized.data()));
462 header.messageLength = 100000;
463 ASSERT_TRUE(assembler.process_packet(serialized));
465 serialized = serialize(info, 12, 9000);
466 ASSERT_TRUE(assembler.process_packet(serialized));
468 const auto stats = assembler.get_message_statistics();
470 ASSERT_EQ(stats.received_messages, 2);
471 ASSERT_EQ(stats.dropped_messages, 1);
472 ASSERT_EQ(stats.invalid_packets, 0);