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);