Skip to content

Commit 4b4ab4b

Browse files
committed
Refs #22901. Extend test with fragmented data.
Signed-off-by: Miguel Company <miguelcompany@eprosima.com>
1 parent de1eadd commit 4b4ab4b

1 file changed

Lines changed: 107 additions & 37 deletions

File tree

test/blackbox/common/BlackboxTestsKeys.cpp

Lines changed: 107 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -392,49 +392,49 @@ TEST(KeyedTopic, key_only_payload)
392392
ASSERT_TRUE(ts != nullptr);
393393
EXPECT_EQ(ts->nb_of_times_called_with_key_only_payload(), 0u);
394394

395-
struct KeyOnlyPayloadPacket
395+
UDPMessageSender fake_msg_sender;
396+
397+
// Send hand-crafted data
396398
{
397-
std::array<char, 4> rtps_id{ {'R', 'T', 'P', 'S'} };
398-
std::array<uint8_t, 2> protocol_version{ {2, 3} };
399-
std::array<uint8_t, 2> vendor_id{ {0x01, 0x0F} };
400-
GuidPrefix_t sender_prefix{};
399+
auto writer_guid = writer.datawriter_guid();
401400

402-
struct DataSubMsg
401+
struct KeyOnlyPayloadPacket
403402
{
404-
struct Header
405-
{
406-
uint8_t submessage_id = 0x15;
407-
#if FASTDDS_IS_BIG_ENDIAN_TARGET
408-
uint8_t flags = 0x08;
409-
#else
410-
uint8_t flags = 0x09;
411-
#endif // FASTDDS_IS_BIG_ENDIAN_TARGET
412-
uint16_t octets_to_next_header = 28;
413-
uint16_t extra_flags = 0;
414-
uint16_t octets_to_inline_qos = 16;
415-
EntityId_t reader_id{};
416-
EntityId_t writer_id{};
417-
SequenceNumber_t sn{ 3 };
418-
};
403+
std::array<char, 4> rtps_id{ {'R', 'T', 'P', 'S'} };
404+
std::array<uint8_t, 2> protocol_version{ {2, 3} };
405+
std::array<uint8_t, 2> vendor_id{ {0x01, 0x0F} };
406+
GuidPrefix_t sender_prefix{};
419407

420-
struct SerializedData
408+
struct DataSubMsg
421409
{
422-
uint8_t encapsulation[2] = {0x00, CDR_LE};
423-
uint8_t encapsulation_opts[2] = {0x00, 0x00};
424-
uint8_t data[4] = {0x01, 0x00, 0x00, 0x00};
425-
};
426-
427-
Header header;
428-
SerializedData payload;
429-
}
430-
data;
431-
};
432-
433-
UDPMessageSender fake_msg_sender;
410+
struct Header
411+
{
412+
uint8_t submessage_id = 0x15;
413+
#if FASTDDS_IS_BIG_ENDIAN_TARGET
414+
uint8_t flags = 0x08;
415+
#else
416+
uint8_t flags = 0x09;
417+
#endif // FASTDDS_IS_BIG_ENDIAN_TARGET
418+
uint16_t octets_to_next_header = 28;
419+
uint16_t extra_flags = 0;
420+
uint16_t octets_to_inline_qos = 16;
421+
EntityId_t reader_id{};
422+
EntityId_t writer_id{};
423+
SequenceNumber_t sn{ 3 };
424+
};
425+
426+
struct SerializedData
427+
{
428+
uint8_t encapsulation[2] = {0x00, CDR_LE};
429+
uint8_t encapsulation_opts[2] = {0x00, 0x00};
430+
uint8_t data[4] = {0x0A, 0x00, 0x00, 0x00};
431+
};
434432

435-
// Send hand-crafted data
436-
{
437-
auto writer_guid = writer.datawriter_guid();
433+
Header header;
434+
SerializedData payload;
435+
}
436+
data;
437+
};
438438

439439
KeyOnlyPayloadPacket key_only_packet{};
440440
key_only_packet.sender_prefix = writer_guid.guidPrefix;
@@ -451,6 +451,76 @@ TEST(KeyedTopic, key_only_payload)
451451

452452
// Wait for key-only compute key to be called
453453
ts->wait_for_key_only_payload(1);
454+
455+
// Send hand-crafted data frags
456+
{
457+
auto writer_guid = writer.datawriter_guid();
458+
459+
struct KeyOnlyPayloadTwoFragmentsPacket
460+
{
461+
std::array<char, 4> rtps_id{ {'R', 'T', 'P', 'S'} };
462+
std::array<uint8_t, 2> protocol_version{ {2, 3} };
463+
std::array<uint8_t, 2> vendor_id{ {0x01, 0x0F} };
464+
GuidPrefix_t sender_prefix{};
465+
466+
struct DataFragSubMsg
467+
{
468+
struct Header
469+
{
470+
uint8_t submessage_id = 0x16;
471+
#if FASTDDS_IS_BIG_ENDIAN_TARGET
472+
uint8_t flags = 0x04;
473+
#else
474+
uint8_t flags = 0x05;
475+
#endif // FASTDDS_IS_BIG_ENDIAN_TARGET
476+
uint16_t octets_to_next_header = 36;
477+
uint16_t extra_flags = 0;
478+
uint16_t octets_to_inline_qos = 28;
479+
EntityId_t reader_id{};
480+
EntityId_t writer_id{};
481+
SequenceNumber_t sn{ 4 };
482+
uint32_t fragment_starting_num = 1;
483+
uint16_t fragments_in_submessage = 1;
484+
uint16_t fragment_size = 4;
485+
uint32_t sample_size = 8;
486+
};
487+
488+
struct SerializedData
489+
{
490+
uint8_t data[4] = {0x00, 0x00, 0x00, 0x00};
491+
};
492+
493+
Header header;
494+
SerializedData payload;
495+
}
496+
data[2];
497+
};
498+
499+
KeyOnlyPayloadTwoFragmentsPacket fragments_packet{};
500+
fragments_packet.sender_prefix = writer_guid.guidPrefix;
501+
502+
// First fragment with encapsulation header
503+
fragments_packet.data[0].header.writer_id = writer_guid.entityId;
504+
fragments_packet.data[0].header.reader_id = reader.datareader_guid().entityId;
505+
fragments_packet.data[0].header.fragment_starting_num = 1;
506+
fragments_packet.data[0].payload.data[1] = CDR_LE;
507+
508+
// Second fragment with serialized key
509+
fragments_packet.data[1].header.writer_id = writer_guid.entityId;
510+
fragments_packet.data[1].header.reader_id = reader.datareader_guid().entityId;
511+
fragments_packet.data[1].header.fragment_starting_num = 2;
512+
fragments_packet.data[1].payload.data[0] = 0x0B;
513+
514+
CDRMessage_t msg(0);
515+
uint32_t msg_len = static_cast<uint32_t>(sizeof(fragments_packet));
516+
msg.init(reinterpret_cast<octet*>(&fragments_packet), msg_len);
517+
msg.length = msg_len;
518+
msg.pos = msg_len;
519+
fake_msg_sender.send(msg, reader_locator);
520+
}
521+
522+
// Wait for key-only compute key to be called
523+
ts->wait_for_key_only_payload(2);
454524
}
455525

456526
/* Uncomment when DDS API supports NO_WRITERS_ALIVE

0 commit comments

Comments
 (0)