40 #include <gtest/gtest.h>
42 #include <details/legacy/message.hh>
46 using namespace multisense::legacy;
48 TEST(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);
59 TEST(unwrap_sequence_id, no_increment)
61 const auto full_sequence_id = unwrap_sequence_id(1, 1, 0);
63 EXPECT_EQ(full_sequence_id, 0);
66 TEST(unwrap_sequence_id, increment)
68 const auto full_sequence_id = unwrap_sequence_id(1, 0, 0);
70 EXPECT_EQ(full_sequence_id, 1);
73 TEST(unwrap_sequence_id, rollover)
75 const auto full_sequence_id = unwrap_sequence_id(0, 65535, 0);
77 EXPECT_EQ(full_sequence_id, 1);
80 TEST(unwrap_sequence_id, rollover_unique)
82 const auto full_sequence_id = unwrap_sequence_id(0, 65535, 123456);
84 EXPECT_EQ(full_sequence_id, 123457);
87 TEST(header_valid, invalid)
89 std::vector<uint8_t> data(50, 0);
91 ASSERT_FALSE(header_valid(data));
100 auto serialized = serialize(info, 10, 9000);
102 ASSERT_TRUE(header_valid(serialized));
111 auto serialized = serialize(info, 10, 9000);
113 const auto type = get_message_type(serialized);
115 ASSERT_EQ(type, wire::SysDeviceInfo::ID);
118 TEST(get_full_message_size, invalid)
120 const auto full_size = get_full_message_size({});
122 ASSERT_FALSE(
static_cast<bool>(full_size));
125 TEST(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);
141 TEST(seralize_deseralize, 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);
165 TEST(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);
186 TEST(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);
206 TEST(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);
230 TEST(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));
252 TEST(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);
287 TEST(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));
315 TEST(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>{}));
338 TEST(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);
359 TEST(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));
395 TEST(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);
415 TEST(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);
444 TEST(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);
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);