@@ -630,8 +630,13 @@ bool test_publisher_control_message_encoders_for_all_drafts() {
630630
631631 ok &= expect_uint16_frame (encode_publish_done_message (draft, 44 , 2 ), 0x0b , frame, label + " publish done" );
632632 if (uses_vi64 (draft)) {
633- ok &= expect (encode_publish_namespace_done_message (namespace_message).empty (),
634- label + " publish namespace done is not emitted" );
633+ const auto namespace_done = encode_publish_namespace_done_message (namespace_message);
634+ ok &= expect_uint16_frame (namespace_done, 0x0e , frame, label + " namespace done" );
635+ offset = frame.payload_offset ;
636+ ok &= expect (read_track_namespace (namespace_done, offset, frame.payload_end , draft, tuple) &&
637+ tuple == std::vector<std::string>({" live" , " alpha" }),
638+ label + " namespace done suffix placement" );
639+ ok &= expect (offset == frame.payload_end , label + " namespace done boundary" );
635640 } else {
636641 ok &= expect_uint16_frame (encode_publish_namespace_done_message (namespace_message), 0x09 , frame,
637642 label + " publish namespace done" );
@@ -814,6 +819,30 @@ bool test_control_message_framing_and_parameter_regressions() {
814819 ok &= expect (!decode_subscribe_message (duplicate_parameter_subscribe, DraftVersion::kDraft16 , subscribe),
815820 " draft-16 rejects duplicate delta-encoded parameter type" );
816821
822+ std::vector<std::uint8_t > draft14_bad_group_order_subscribe =
823+ build_subscribe_message (DraftVersion::kDraft14 );
824+ for (std::size_t index = 0 ; index + 3 < draft14_bad_group_order_subscribe.size (); ++index) {
825+ if (draft14_bad_group_order_subscribe[index] == 128 &&
826+ draft14_bad_group_order_subscribe[index + 1 ] == 1 &&
827+ draft14_bad_group_order_subscribe[index + 2 ] == 1 &&
828+ draft14_bad_group_order_subscribe[index + 3 ] == 3 ) {
829+ draft14_bad_group_order_subscribe[index + 1 ] = 0 ;
830+ break ;
831+ }
832+ }
833+ ok &= expect (!decode_subscribe_message (
834+ draft14_bad_group_order_subscribe, DraftVersion::kDraft14 , subscribe),
835+ " draft-14 SUBSCRIBE rejects group order 0" );
836+
837+ std::vector<std::uint8_t > draft14_bad_group_order_publish_ok =
838+ build_publish_ok_message (DraftVersion::kDraft14 );
839+ if (draft14_bad_group_order_publish_ok.size () > 5 ) {
840+ draft14_bad_group_order_publish_ok[5 ] = 0 ;
841+ }
842+ PublishOk publish_ok;
843+ ok &= expect (!decode_publish_ok (draft14_bad_group_order_publish_ok, DraftVersion::kDraft14 , publish_ok),
844+ " draft-14 PUBLISH_OK rejects group order 0" );
845+
817846 std::vector<std::uint8_t > request_ok_payload;
818847 append_varint (request_ok_payload, 44 );
819848 append_varint (request_ok_payload, 1 );
@@ -826,6 +855,42 @@ bool test_control_message_framing_and_parameter_regressions() {
826855 " draft-16 REQUEST_OK decodes delta-encoded parameters" );
827856 ok &= expect (namespace_ok.request_id == 44 , " draft-16 REQUEST_OK request id with parameters" );
828857
858+ std::vector<std::uint8_t > draft18_request_ok_payload;
859+ append_moqint (draft18_request_ok_payload, DraftVersion::kDraft18 , 2 );
860+ append_moqint (draft18_request_ok_payload, DraftVersion::kDraft18 , 0x21 );
861+ append_moqint (draft18_request_ok_payload, DraftVersion::kDraft18 , 0 );
862+ append_moqint (draft18_request_ok_payload, DraftVersion::kDraft18 , 1 );
863+ append_moqint (draft18_request_ok_payload, DraftVersion::kDraft18 , 7 );
864+ std::vector<std::uint8_t > draft18_request_ok;
865+ append_moqint (draft18_request_ok, DraftVersion::kDraft18 , 0x07 );
866+ draft18_request_ok.push_back (static_cast <std::uint8_t >((draft18_request_ok_payload.size () >> 8 ) & 0xff ));
867+ draft18_request_ok.push_back (static_cast <std::uint8_t >(draft18_request_ok_payload.size () & 0xff ));
868+ draft18_request_ok.insert (
869+ draft18_request_ok.end (), draft18_request_ok_payload.begin (), draft18_request_ok_payload.end ());
870+ ok &= expect (decode_request_ok (draft18_request_ok, DraftVersion::kDraft18 , namespace_ok),
871+ " draft-18 REQUEST_OK decodes multi-parameter delta KVPs" );
872+
873+ std::vector<std::uint8_t > draft18_subscribe_namespace_payload;
874+ append_moqint (draft18_subscribe_namespace_payload, DraftVersion::kDraft18 , 2 );
875+ append_track_namespace (draft18_subscribe_namespace_payload, DraftVersion::kDraft18 , {" live" });
876+ append_moqint (draft18_subscribe_namespace_payload, DraftVersion::kDraft18 , 2 );
877+ append_moqint (draft18_subscribe_namespace_payload, DraftVersion::kDraft18 , 0x21 );
878+ append_moqint (draft18_subscribe_namespace_payload, DraftVersion::kDraft18 , 0 );
879+ append_moqint (draft18_subscribe_namespace_payload, DraftVersion::kDraft18 , 1 );
880+ append_moqint (draft18_subscribe_namespace_payload, DraftVersion::kDraft18 , 7 );
881+ std::vector<std::uint8_t > draft18_subscribe_namespace;
882+ append_moqint (draft18_subscribe_namespace, DraftVersion::kDraft18 , 0x50 );
883+ draft18_subscribe_namespace.push_back (
884+ static_cast <std::uint8_t >((draft18_subscribe_namespace_payload.size () >> 8 ) & 0xff ));
885+ draft18_subscribe_namespace.push_back (static_cast <std::uint8_t >(draft18_subscribe_namespace_payload.size () & 0xff ));
886+ draft18_subscribe_namespace.insert (draft18_subscribe_namespace.end (),
887+ draft18_subscribe_namespace_payload.begin (),
888+ draft18_subscribe_namespace_payload.end ());
889+ SubscribeNamespaceMessage subscribe_namespace;
890+ ok &= expect (decode_subscribe_namespace_message (
891+ draft18_subscribe_namespace, DraftVersion::kDraft18 , subscribe_namespace),
892+ " draft-18 SUBSCRIBE_NAMESPACE decodes multi-parameter delta KVPs" );
893+
829894 const std::vector<std::uint8_t > draft18_namespace_ok =
830895 encode_subscribe_namespace_ok_message (DraftVersion::kDraft18 , 44 );
831896 Uint16Frame frame;
0 commit comments