40 #include <gtest/gtest.h>
52 EXPECT_EQ(full_sequence_id, 0);
56 EXPECT_EQ(full_sequence_id, 0);
63 EXPECT_EQ(full_sequence_id, 0);
70 EXPECT_EQ(full_sequence_id, 1);
77 EXPECT_EQ(full_sequence_id, 1);
84 EXPECT_EQ(full_sequence_id, 123457);
89 std::vector<uint8_t> data(50, 0);
100 auto serialized =
serialize(info, 10, 9000);
111 auto serialized =
serialize(info, 10, 9000);
115 ASSERT_EQ(
type, wire::SysDeviceInfo::ID);
122 ASSERT_FALSE(
static_cast<bool>(full_size));
131 const auto serialized =
serialize(info, 10, 9000);
135 ASSERT_TRUE(
static_cast<bool>(full_size));
137 ASSERT_GT(full_size.value(), 20);
138 ASSERT_LT(full_size.value(), 200);
141 TEST(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);
168 using namespace std::chrono_literals;
172 auto serialized =
serialize(info, 10, 9000);
176 ASSERT_TRUE(assembler.process_packet(serialized));
180 ASSERT_TRUE(
static_cast<bool>(output));
182 ASSERT_EQ(output->name, info.name);
189 using namespace std::chrono_literals;
192 info.
name =
"test_wait";
193 auto serialized =
serialize(info, 10, 9000);
197 ASSERT_TRUE(assembler.process_packet(serialized));
201 ASSERT_TRUE(
static_cast<bool>(output));
203 ASSERT_EQ(output->name, info.name);
209 using namespace std::chrono_literals;
213 auto serialized =
serialize(info, 10, 9000);
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);
233 using namespace std::chrono_literals;
237 auto serialized =
serialize(info, 10, 9000);
241 assembler.remove_registration(wire::SysDeviceInfo::ID);
242 ASSERT_TRUE(assembler.process_packet(serialized));
249 ASSERT_FALSE(
static_cast<bool>(output));
255 using namespace std::chrono_literals;
258 info.
name =
"test_callback";
259 auto serialized =
serialize(info, 10, 9000);
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";
282 ASSERT_TRUE(assembler.process_packet(serialized));
284 ASSERT_NE(output.
name, info.name);
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;
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));
318 using namespace std::chrono_literals;
321 info.
name =
"test_callback";
322 auto serialized =
serialize(info, 10, 9000);
334 ASSERT_FALSE(assembler.process_packet(serialized));
335 ASSERT_FALSE(assembler.process_packet(std::vector<uint8_t>{}));
341 using namespace std::chrono_literals;
344 info.
name =
"test_callback";
345 auto serialized =
serialize(info, 10, 9000);
350 ASSERT_TRUE(assembler.process_packet(serialized));
354 ASSERT_TRUE(
static_cast<bool>(output));
356 ASSERT_EQ(output->name, info.name);
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;
383 for (
size_t i = 1 ; i < 100 ; ++i)
385 ASSERT_TRUE(assembler.process_packet(serialized));
388 ASSERT_FALSE(
static_cast<bool>(output));
398 using namespace std::chrono_literals;
401 info.
name =
"test_callback";
402 auto serialized =
serialize(info, 10, 9000);
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);
418 using namespace std::chrono_literals;
421 info.
name =
"test_callback";
422 auto serialized =
serialize(info, 10, 9000);
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);
447 using namespace std::chrono_literals;
450 info.
name =
"test_callback";
451 auto serialized =
serialize(info, 10, 9000);
458 ASSERT_TRUE(assembler.process_packet(serialized));
461 wire::Header&
header = *(
reinterpret_cast<wire::Header*
>(serialized.data()));
462 header.messageLength = 100000;
463 ASSERT_TRUE(assembler.process_packet(serialized));
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);