@@ -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