@@ -960,6 +960,59 @@ int main() {
960960 }
961961 }
962962
963+ {
964+ MockTransport transport;
965+ transport.reads [0 ].push_back (encode_server_setup_message ({
966+ .draft = DraftVersion::kDraft14 ,
967+ .max_request_id = 8 ,
968+ }));
969+ transport.reads [0 ].push_back (encode_publish_namespace_ok_message (DraftVersion::kDraft14 , 0 ));
970+ transport.reads [0 ].push_back (encode_publish_ok_message (DraftVersion::kDraft14 , 2 , 1 ));
971+ transport.reads [0 ].push_back (encode_subscribe_message (3 , kTestTrackNamespace , " vide_1" , 0 ));
972+ MoqtSession session (transport, std::string (kTestTrackNamespace ), false , true );
973+
974+ auto status = session.connect (endpoint, tls);
975+ ok &= expect (status.ok , " expected catalog-content session connect to succeed" );
976+
977+ PublishPlan catalog_content_plan = make_span_backed_plan (DraftVersion::kDraft14 );
978+ const std::string catalog_text =
979+ " {\" version\" :1,\" format\" :\" cmsf\" ,\" tracks\" :[{\" name\" :\" vide_1\" ,\" initData\" :\" AAAA\" }]}" ;
980+ catalog_content_plan.objects [0 ].payload = ByteSpan{.offset = 0 , .size = catalog_text.size ()};
981+ catalog_content_plan.objects [1 ].payload = ByteSpan{.offset = catalog_text.size (), .size = 3 };
982+ std::vector<std::uint8_t > catalog_source_bytes (catalog_text.begin (), catalog_text.end ());
983+ catalog_source_bytes.insert (catalog_source_bytes.end (), {' V' , ' I' , ' D' });
984+ const PublishPlan materialized = materialize_publish_plan (catalog_content_plan, catalog_source_bytes);
985+
986+ status = session.publish (materialized);
987+ ok &= expect (status.ok , " expected publish to succeed with catalog content validation" );
988+ ok &= expect (transport.writes .size () >= 4 ,
989+ " expected catalog-content flow to emit catalog object stream" );
990+ if (transport.writes .size () >= 4 ) {
991+ std::uint64_t stream_type = 0 ;
992+ std::uint64_t track_alias = 0 ;
993+ std::uint64_t group_id = 0 ;
994+ std::uint64_t object_id_delta = 0 ;
995+ std::uint64_t payload_length = 0 ;
996+ std::vector<std::uint8_t > payload;
997+ ok &= expect (
998+ decode_object_stream_fields (transport.writes [3 ].bytes ,
999+ stream_type,
1000+ track_alias,
1001+ group_id,
1002+ object_id_delta,
1003+ payload_length,
1004+ payload),
1005+ " expected catalog-content object stream fields to decode" );
1006+ const std::string served_catalog (payload.begin (), payload.end ());
1007+ ok &= expect (served_catalog.find (" \" format\" :\" cmsf\" " ) != std::string::npos,
1008+ " expected served catalog payload to include cmsf format" );
1009+ ok &= expect (served_catalog.find (" \" name\" :\" vide_1\" " ) != std::string::npos,
1010+ " expected served catalog payload to include vide_1 track" );
1011+ ok &= expect (served_catalog.find (" \" initData\" :\" AAAA\" " ) != std::string::npos,
1012+ " expected served catalog payload to include initData" );
1013+ }
1014+ }
1015+
9631016 {
9641017 MockTransport transport;
9651018 transport.reads [0 ].push_back (encode_server_setup_message ({
0 commit comments